Ios 在swift 4中提交时循环通过uitableviewcell
我试图在提交时访问UITableView中原型单元格中文本字段的每个值。我知道我应该用一种更好的方式(模型)来做这件事,但现在,我只需要访问这些字段,在Swift 3/4中找不到这样做的方法。有人能帮忙吗 代码:Ios 在swift 4中提交时循环通过uitableviewcell,ios,swift,uitableview,loops,Ios,Swift,Uitableview,Loops,我试图在提交时访问UITableView中原型单元格中文本字段的每个值。我知道我应该用一种更好的方式(模型)来做这件事,但现在,我只需要访问这些字段,在Swift 3/4中找不到这样做的方法。有人能帮忙吗 代码: 如果只想在单元格中循环,可以创建一个“IndexPath”数组 let array = (0..<formLabels.count).map { IndexPath(row: $0, section:0) } let array=(0..您似乎承认直接更新模型可能有意义。那么为
如果只想在单元格中循环,可以创建一个“IndexPath”数组
let array = (0..<formLabels.count).map { IndexPath(row: $0, section:0) }
let array=(0..您似乎承认直接更新模型可能有意义。那么为什么不这样做呢?只是:
对响应进行模型收集
为单元格中的文本字段设置委托
让cellForRowAt
设置该委托;以及
使表视图控制器符合该类
因此,如果是快速和肮脏的,请设置单元格以从文本字段连接editChanged
事件,并设置协议以通知视图控制器:
protocol FormTableViewCellDelegate: class {
func fieldValueChanged(cell: UITableViewCell, textField: UITextField)
}
class FormTableViewCell: UITableViewCell {
weak var delegate: FormTableViewCellDelegate?
@IBOutlet weak var formLabel: UILabel!
@IBOutlet weak var formTextField: UITextField!
@IBAction func editingChanged(_ sender: UITextField) {
delegate?.fieldValueChanged(cell: self, textField: sender)
}
}
然后让视图控制器设置模型对象并符合您的新协议:
class FormTableViewController: UITableViewController {
var formLabels = [String]()
var formPlaceholders = [String]()
var values = [String?]()
override func viewDidLoad() {
super.viewDidLoad()
...
formLabels = ["Name","Email","Password", "Phone"]
formPlaceholders = ["John Smith","example@email.com","Enter Password", "8585551234"]
values = [nil, nil, nil, nil]
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "FormTableCell", for: indexPath) as! FormTableViewCell
let row = indexPath.row
cell.formLabel.font = .preferredFont(forTextStyle: .headline)
cell.formLabel.text = formLabels[row]
cell.formTextField.placeholder = formPlaceholders[row]
cell.formTextField.text = values[row]
cell.delegate = self // set the delegate, too
return cell
}
@IBAction func submitButtonPressed(_ sender: Any) {
print(#function, values)
}
}
// delegate protocol to update model as text fields change
extension FormTableViewController: FormTableViewCellDelegate {
func fieldValueChanged(cell: UITableViewCell, textField: UITextField) {
guard let indexPath = tableView.indexPath(for: cell) else { return }
values[indexPath.row] = textField.text
}
}
就是这样,你的模型会随着文本字段的更新而更新。另外,它的优点是现在支持单元重用,符合MVC模式,等等
class FormTableViewController: UITableViewController {
var formLabels = [String]()
var formPlaceholders = [String]()
var values = [String?]()
override func viewDidLoad() {
super.viewDidLoad()
...
formLabels = ["Name","Email","Password", "Phone"]
formPlaceholders = ["John Smith","example@email.com","Enter Password", "8585551234"]
values = [nil, nil, nil, nil]
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "FormTableCell", for: indexPath) as! FormTableViewCell
let row = indexPath.row
cell.formLabel.font = .preferredFont(forTextStyle: .headline)
cell.formLabel.text = formLabels[row]
cell.formTextField.placeholder = formPlaceholders[row]
cell.formTextField.text = values[row]
cell.delegate = self // set the delegate, too
return cell
}
@IBAction func submitButtonPressed(_ sender: Any) {
print(#function, values)
}
}
// delegate protocol to update model as text fields change
extension FormTableViewController: FormTableViewCellDelegate {
func fieldValueChanged(cell: UITableViewCell, textField: UITextField) {
guard let indexPath = tableView.indexPath(for: cell) else { return }
values[indexPath.row] = textField.text
}
}