#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)"
}
}
}
надеюсь, это помогло.