Как я могу обновить текстовые значения в поле UIText в многократно используемой ячейке tableView, используя разные значения в каждой ячейке - PullRequest
0 голосов
/ 04 января 2019

Я делаю конвертер валют, который обновляет валюты одновременно с вводом.Валюты хранятся в табличном представлении, и ячейка является настраиваемой ячейкой.

Я хочу иметь возможность вводить в одну ячейку и видеть, как все остальные ячейки обновляются в соответствии со значением из расчета преобразования.Расчет работает, но я не уверен, как вернуть данные в правильные ячейки, так как по сути есть только одна, поскольку это многократно используемая ячейка.

Вот класс ячейки (я просто показываюввод, чтобы все было ясно.):

class PageCell: UITableViewCell {

let cellCalcInput = UITextField()

func configureCustomCell() {

    contentView.addSubview(cellCalcInput)
    cellCalcInput.translatesAutoresizingMaskIntoConstraints = false
    cellCalcInput.rightAnchor.constraint(equalTo: contentView.rightAnchor, constant: -10).isActive = true
    cellCalcInput.centerYAnchor.constraint(equalTo: contentView.centerYAnchor).isActive = true
    cellCalcInput.font = secondFont?.withSize(18)
    cellCalcInput.textColor = .white
    cellCalcInput.placeholder = "Enter an amount"
    cellCalcInput.keyboardType = .decimalPad
    cellCalcInput.borderStyle = .roundedRect
    cellCalcInput.backgroundColor = .clear

    cellCalcInput.isHidden = true
    self.backgroundColor = .darkGray
    contentView.contentMode = .scaleAspectFit

}

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String!) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

}

Далее я создаю ячейки, я показываю больше, чтобы вы поняли, как я устанавливаю данные для каждой ячейки для выбранной валюты.

Затем я добавляю слушатель 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")
    }

}

и здесь я делаю вычисления, когда они набираются,и получить результаты, это не завершено, но мне нужно теперь каким-то образом отобразить эти результаты внутри поля UIText для каждой ячейки, относящиеся к правильной валюте.

    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

}

Здесь в основном я делаю вычисления, на основе которыхячейка набирается, и я могу узнать, какая валюта это из тега, а затем, используя индекс валюты, я могу проверить мой API и получить его имя и значения, а затем я делаю расчет, чтобы comсравнить другие валюты со значением, которое ввел пользователь.Расчеты работают и дают правильные результаты, я просто не знаю, как отправить результаты обратно в правильные ячейки.Спасибо.

Извините, если это очень неряшливая работа, я все еще плохо знаком с кодированием.

1 Ответ

0 голосов
/ 04 января 2019

Вы можете поместить свои результаты в словарь типа [Int : Double], где Int - это coinIndex, а часть Double - это ответ от преобразования.Затем, после окончания вычислений, вы можете позвонить tableView.reloadData.().

. Вам также нужно внести изменения в cellForRowAt, чтобы показать преобразование.

Попробуйте это:

В вашем UIViewController объявите

var conversions: [Int : Double] = [:]

Затем в cellForRowAt:

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()
}

Iдумаю, что вы можете улучшить свою функцию calculations.Вы можете перебирать индекс монеты вместо рекурсивного обновления ответов.Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...