Обновлять label.text во время выполнения

Я пытаюсь обновить значение label.text в строке таблицы. Предполагается, что обновление запускается пользователем, вводящим число в другое текстовое поле в этой строке:

введите здесь описание изображения

Мой код выглядит так:

Swift 3: ViewController

import UIKit

class RiskPlan: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!
    var probability1 = String()
    var impact1 = String()
    var riskFactor = String()

    var result = Int()

func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = self.tableView!.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CellCustomized

    impact1 = (cell.impact?.text)!
    probability1 = (cell.probability?.text)!

    result = Int(impact1)! * Int(probability1)!
    cell.riskFactor?.text = String(result)

    self.tableView.reloadRows(at: [indexPath], with: UITableViewRowAnimation.top)

        return cell
    }
}

Swift 3: CellCustomized

import UIKit

class CellCustomized: UITableViewCell {

    @IBOutlet weak var probability: UITextField!
    @IBOutlet weak var impact: UITextField!
    @IBOutlet weak var riskFactor: UILabel!    

}

Моя проблема в том, что

  • self.tableView.reloadRows(at: [indexPath], with: UITableViewRowAnimation.top) не выполняет обновление и
  • Я получаю «фатальную ошибку: неожиданно найдено nil при развертывании необязательного значения» для result = Int(impact1)! * Int(probability1)!

person Jake2Finn    schedule 04.10.2016    source источник
comment
Вам действительно нужно табличное представление только для 1 строки? Кроме того, вы можете ознакомиться с методами делегирования текстового поля здесь   -  person Yash Tamakuwala    schedule 04.10.2016
comment
На самом деле я использую myItem.count, так как у меня есть переменное количество строк в моей таблице. Я заменил его на 1 только для того, чтобы упростить этот пост. :-) Как реализовать UITextFieldTextDidEndEditing в моем коде? Я сейчас немного потерян. Где проблема с ошибкой нулевого значения? Я определил свои переменные пустыми, поэтому такой фатальной ошибки быть не может!?   -  person Jake2Finn    schedule 04.10.2016


Ответы (2)


Если вы хотите знать, когда в текстовые поля вносятся изменения, func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell — это не то место, куда вы хотите поместить свой код расчета.

Вместо этого вы должны прослушивать событие .editingChanged в текстовых полях из вашего класса CellCustomized.

class RiskPlan: UIViewController, UITableViewDelegate, UITableViewDataSource {

  @IBOutlet weak var tableView: UITableView!

  func numberOfSections(in tableView: UITableView) -> Int {
    return 1
  }

  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
  }

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = self.tableView!.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! CellCustomized

    return cell
  }
}

class CellCustomized: UITableViewCell {

  @IBOutlet weak var probability: UITextField!
  @IBOutlet weak var impact: UITextField!
  @IBOutlet weak var riskFactor: UILabel!

  var probability1 = 0
  var impact1 = 0

  override func awakeFromNib() {
    super.awakeFromNib()

    probability.addTarget(self, action: #selector(textOnTextFieldDidChange(textField:)), for: .editingChanged)
    impact.addTarget(self, action: #selector(textOnTextFieldDidChange(textField:)), for: .editingChanged)
  }

  func textOnTextFieldDidChange(textField: UITextField) {
    if textField === probability {
      probability1 = Int(textField.text!) ?? 0
    } else if textField === impact {
      impact1 = Int(textField.text!) ?? 0
    }

    riskFactor.text = String(probability1 * impact1)
  }

}
person Wilson    schedule 04.10.2016
comment
Спасибо! Работает как шарм! - person Jake2Finn; 04.10.2016

Если я не ошибаюсь, вы хотите обновить текст метки в зависимости от того, что вы вставляете в текстовые поля.

В вашем CellCustomized вы можете сделать это:

class CellCustomized: UITableViewCell {

    // assuming that the outlets has been renamed...
    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var label: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()

        textField.addTarget(self, action: #selector(editing(sender:)), for: .editingChanged)
    }

    func editing(sender: UITextField) {
        // checking if the input is convertible to a number, and then add 5 for it (you can do your own operations)
        if let string = sender.text, Int(sender.text!) != nil {
            let int = Int(string)

            label.text = "\(int! + 5)"
        }
    }
}

надеюсь, что помогло.

person Ahmad F    schedule 04.10.2016