Ios 如何使用每个单元格中的不同值更新可重用tableView单元格中UITextfield中的文本值
我正在制作一个货币转换器,在你打字的同时更新货币。货币保存在表视图中,单元格为自定义单元格 我希望能够在一个单元格中键入,并看到所有其他单元格都使用转换计算中的值进行更新。计算是可行的,但我不确定如何将数据返回到正确的单元格中,因为基本上只有一个单元格,因为它是一个可重用的单元格 这是cell类(我只是显示输入以保持清晰): 接下来我创建单元格,我将显示更多内容,以便您了解我如何将每个单元格的数据设置为所选货币Ios 如何使用每个单元格中的不同值更新可重用tableView单元格中UITextfield中的文本值,ios,swift,uitableview,uitextfield,Ios,Swift,Uitableview,Uitextfield,我正在制作一个货币转换器,在你打字的同时更新货币。货币保存在表视图中,单元格为自定义单元格 我希望能够在一个单元格中键入,并看到所有其他单元格都使用转换计算中的值进行更新。计算是可行的,但我不确定如何将数据返回到正确的单元格中,因为基本上只有一个单元格,因为它是一个可重用的单元格 这是cell类(我只是显示输入以保持清晰): 接下来我创建单元格,我将显示更多内容,以便您了解我如何将每个单元格的数据设置为所选货币 var coinIndexes = [Int]() var answers
var coinIndexes = [Int]()
var answers = [Double]()
//
var comparitorIndex = 0
func calculations(dataIndex: Int, calcInput: UITextField) {
let exchangeRate = CGExchange.shared.exchangeData[0].rates[defaultCurrency]!.value
//
let btcPrice = CGPrices.shared.coinData[dataIndex].current_price!
//
if answers.count < coinIndexes.count {
var calculation = ""
if CGPrices.shared.coinData[dataIndex].id == "bitcoin" {
calculation = String(Double(calcInput.text!)! / btcPrice)
} else {
calculation = String(Double(calcInput.text!)! * btcPrice)
}
let calcAsDouble = Double(calculation)
let calcFinal = Double(round(1000*calcAsDouble!)/1000)
var comparitor = coinIndexes[comparitorIndex]
var comparitorPrice = CGPrices.shared.coinData[comparitor].current_price!
var comparitorAnswer = (calcFinal/comparitorPrice)
answers.append(comparitorAnswer)
comparitorIndex += 1
print(comparitorAnswer)
calculations(dataIndex: dataIndex, calcInput: calcInput)
}
comparitorIndex = 0
}
然后我添加了一个textFieldDidChange侦听器:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var coinName = String()
tableView.separatorStyle = .none
let cell:PageCell = tableView.dequeueReusableCell(withIdentifier: "PageCell") as! PageCell
cell.configureCustomCell()
let index = indexPath.row
let coins = Manager.shared.coins
let coin = coins[index]
var coinIndex = Int()
coinIndex = CGPrices.shared.coinData.index(where: { $0.id == coin })!
let unit = CGExchange.shared.exchangeData[0].rates[defaultCurrency]!.unit
coinIndexes.append(coinIndex)
//Prices from btc Exchange rate.
let btcPrice = CGPrices.shared.coinData[coinIndex].current_price!
let dcExchangeRate = CGExchange.shared.exchangeData[0].rates[defaultCurrency]!.value
let realPrice = (btcPrice*dcExchangeRate)
setBackground(dataIndex: coinIndex, contentView: cell.contentView)
coinName = CGPrices.shared.coinData[coinIndex].name
let imageString = CGPrices.shared.coinData[coinIndex].image
cell.theImageView.sd_setImage(with: URL(string: imageString), placeholderImage: UIImage(named: "CryptiXJustX"))
cell.cellTextLabel.text = coinName
cell.cellDetailLabel.text = "\(unit)\((round(1000*realPrice)/1000))"
cell.cellCalcInput.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
//这是文本侦听器
return cell
}
@objc func textFieldDidChange(_ textField: UITextField) {
var index = Int()
index = textField.tag
if textField.text != "" {
calculations(dataIndex: index, calcInput: textField)
} else {
print("no text")
}
}
这里是我在键入时进行计算的地方,并得到结果,它不完整,但我现在需要以某种方式获得显示在每个单元格的UITextfield中的结果,与正确的货币相关
var coinIndexes = [Int]()
var answers = [Double]()
//
var comparitorIndex = 0
func calculations(dataIndex: Int, calcInput: UITextField) {
let exchangeRate = CGExchange.shared.exchangeData[0].rates[defaultCurrency]!.value
//
let btcPrice = CGPrices.shared.coinData[dataIndex].current_price!
//
if answers.count < coinIndexes.count {
var calculation = ""
if CGPrices.shared.coinData[dataIndex].id == "bitcoin" {
calculation = String(Double(calcInput.text!)! / btcPrice)
} else {
calculation = String(Double(calcInput.text!)! * btcPrice)
}
let calcAsDouble = Double(calculation)
let calcFinal = Double(round(1000*calcAsDouble!)/1000)
var comparitor = coinIndexes[comparitorIndex]
var comparitorPrice = CGPrices.shared.coinData[comparitor].current_price!
var comparitorAnswer = (calcFinal/comparitorPrice)
answers.append(comparitorAnswer)
comparitorIndex += 1
print(comparitorAnswer)
calculations(dataIndex: dataIndex, calcInput: calcInput)
}
comparitorIndex = 0
}
var coindexes=[Int]()
var answers=[Double]()
//
var comparitorIndex=0
func计算(数据索引:Int,输入:UITextField){
让exchangeRate=CGExchange.shared.exchangeData[0]。汇率[defaultCurrency]!.value
//
让btcPrice=CGPrices.shared.coinData[dataIndex]。当前价格!
//
如果answers.count
在这里,我基本上根据输入的单元格进行计算,我可以从标记中找出它是哪种货币,然后使用货币的索引检查API并获取其名称和值,然后进行计算以将其他货币与用户输入的值进行比较。计算工作并给出正确的结果,我只是不知道如何将结果发送回正确的单元格。多谢各位
抱歉,如果这是一项非常草率的工作,我对编码还是很陌生。您可以将结果放入字典类型
[Int:Double]
,其中Int
是coinIndex
,而Double
部分是转换的答案。然后,在计算完成后,可以调用tableView.reloadData。(
)
您还需要修改cellForRowAt
以显示转换
试试这个:
在UIViewController中,声明
var conversions: [Int : Double] = [:]
然后在<代码>单元格中单击“行”:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// your code here
let conversion = conversions[index]
// the ?? operator will pass "No Value" string if conversion is nil.
cell.cellCalcInput.text = String(conversion ?? "No Value")
}
您需要更新计算函数中的转换
func calculations(dataIndex: Int, calcInput: UITextField) {
// your code here
conversions[comparatorIndex] = comparatorAnswer
// once all conversions are entered
tableView.reloadData()
}
我认为您可以改进
计算功能。您可以迭代硬币索引,而不是递归更新答案。祝你好运 这看起来很棒!非常感谢。对于cellForRowAt中的部分,我不能这样做,除非我在文本框中输入了一些内容,或者它找到了nil,但这也可能是因为我将其更改为let conversion=conversions[index]cell.cellconsiput.text=String(Double(conversion!))
并强制展开与原始代码一样,我遇到了一个错误:“无法使用类型为”(Double?)的参数列表调用类型为“String”的初始值设定项有什么想法吗?我可能只需要使用一个从textdicchange设置为true的布尔值,在执行cell.cellconsignput.text=String(转换)之前检查该值是否为true
因此,仅当textInput中确实存在值时才会调用它。我会检查这个当我可以和接受当我有它所有的工作!我更新了答案。您可以使用?
运算符检查值是否为零,如果为零,则传递一个替代值。对于String(Double(conversion!),请记住Double(String)
构造函数将返回一个可选值,因为并非所有字符串都可以转换为Double。谢谢,这已经起作用了。当你说我可以改进我的计算功能时,你能详细说明一下吗?我遇到的最后一个问题是在将所有索引和计算添加到转换
字典之前处理它们。我试图得到一个索引和原始价格的字典,然后对该字典中的每一项进行计算,并将答案放回转换字典,但我不确定如何格式化。谢谢。那确实是一个更整洁的解决办法。请记住,您可以使用for
循环遍历字典中的每个键值对。因此,您的比较器
将是字典中的键,您将使用数据索引
来计算费率。通过这种方式,您可以将所有计算逻辑放入for
循环中,并取消递归!