Ios 在swift 4中提交时循环通过uitableviewcell

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..您似乎承认直接更新模型可能有意义。那么为

我试图在提交时访问UITableView中原型单元格中文本字段的每个值。我知道我应该用一种更好的方式(模型)来做这件事,但现在,我只需要访问这些字段,在Swift 3/4中找不到这样做的方法。有人能帮忙吗

代码:


如果只想在单元格中循环,可以创建一个“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
        }
    }