Ios 如何使用每个单元格中的不同值更新可重用tableView单元格中UITextfield中的文本值

Ios 如何使用每个单元格中的不同值更新可重用tableView单元格中UITextfield中的文本值,ios,swift,uitableview,uitextfield,Ios,Swift,Uitableview,Uitextfield,我正在制作一个货币转换器,在你打字的同时更新货币。货币保存在表视图中,单元格为自定义单元格 我希望能够在一个单元格中键入,并看到所有其他单元格都使用转换计算中的值进行更新。计算是可行的,但我不确定如何将数据返回到正确的单元格中,因为基本上只有一个单元格,因为它是一个可重用的单元格 这是cell类(我只是显示输入以保持清晰): 接下来我创建单元格,我将显示更多内容,以便您了解我如何将每个单元格的数据设置为所选货币 var coinIndexes = [Int]() var answers

我正在制作一个货币转换器,在你打字的同时更新货币。货币保存在表视图中,单元格为自定义单元格

我希望能够在一个单元格中键入,并看到所有其他单元格都使用转换计算中的值进行更新。计算是可行的,但我不确定如何将数据返回到正确的单元格中,因为基本上只有一个单元格,因为它是一个可重用的单元格

这是cell类(我只是显示输入以保持清晰):

接下来我创建单元格,我将显示更多内容,以便您了解我如何将每个单元格的数据设置为所选货币

    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
循环中,并取消递归!