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

#ios #swift #uitableview #swift3 #reloaddata

#iOS #swift #uitableview #swift3 #reloaddata

Вопрос:

Я пытаюсь сделать так, чтобы значение 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: настраиваемая ячейка

 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)!

Комментарии:

1. Вам действительно нужен tableview только для 1 строки? Кроме того, вы можете ознакомиться с методами делегирования текстового поля здесь

2. Я на самом деле использую MyItem.count, поскольку у меня в таблице переменное количество строк. Я заменил его на 1 только для уменьшения сложности этого сообщения. 🙂 Как мне реализовать UITextFieldTextDidEndEditing в моем коде? Сейчас я немного потерян. В чем проблема, связанная с ошибкой нулевого значения? Я определил свои переменные пустыми, поэтому подобная фатальная ошибка не может возникнуть !?

Ответ №1:

Если вы хотите знать, когда в текстовых 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)
  }

}
  

Ответ №2:

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

В вашем 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)"
        }
    }
}
  

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