UITableView 中的多个文本字段在 textFieldShouldReturn 时更新错误的文本字段

Multiple textFields in UITableView update the wrong textField when textFieldShouldReturn

我正在通过 UITableView 创建一个表单,使用自定义 UITableViewCells,其中每个包含一个 UITextField

我正在使用 textFieldShouldReturn 跳转到下一个 textField,但我不明白为什么我在一个 textField 中输入的内容会随机(实际上,有奇怪的模式)出现在另一个 textField 中。

这里是自定义的 UITableViewCell

class RPTableViewCell: UITableViewCell {
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var textField: DictionaryTextField!
    @IBOutlet weak var errorLabel: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        titleLabel.textColor = Constants.secondaryColor
        textField.textColor = Constants.secondaryColor
        contentView.isUserInteractionEnabled = false
        errorLabel.isHidden = true
    }

    func setTag(tag: Int) {
        textField.tag = 100 + tag
    }
}

然后在我的 FormViewController 我做

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    guard let field = formFields?[indexPath.row] else { return UITableViewCell() }        
    if let cell = tableView.dequeueReusableCell(withIdentifier: "cellID") as? RPTableViewCell {
        cell.titleLabel.text = field["displayText"]?.uppercased
        cell.textField.text = field["userAnswer"] as? String // This was missing, but is key
        cell.textField.placeholder = field["placeholder"] as? String
        cell.setTag(tag: indexPath.row)
        cell.textField.delegate = self
        return cell
    } else {
        return UITableViewCell()
    }
}

 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        guard let cell = tableView.cellForRow(at: indexPath) as? RPTableViewCell else { return }
        tableView.scrollToRow(at: indexPath, at: .middle, animated: true)
        cell.textField.becomeFirstResponder()
    }

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if let nextTextField = tableView.viewWithTag(textField.tag + 1) as? UITextField {
            tableView.deselectRow(at: IndexPath(row: textField.tag - 100, section: 0), animated: false)
            tableView.selectRow(at: IndexPath(row: textField.tag - 99, section: 0),
                                animated: false, scrollPosition: .middle)
            nextTextField.becomeFirstResponder()
        } else {
            textField.resignFirstResponder()
        }
        return false
    }

编辑:

viewDidLoad 中,我像这样加载 formFiels

// Read from a JSON file
guard let visitorPaths = Constants.configDict()?["visitorPaths"] as? [Dictionary<String, AnyObject>] else {
        print("Error: no visitorPaths found in the configuration")
        return
    }
formFields = visitorPaths.first!["fields"]! as? [[String: AnyObject]]

您正在使用以下无效的代码段:

if let nextTextField = tableView.viewWithTag(textField.tag + 1) as? UITextField 

文本字段不是您的 tableView 的子视图。 Textfield 是 TableViewCell 的子视图。

您可以访问 textFieldShouldReturn(_ textField: UITextField) 委托方法中的单元格,如下所示:

let nextIndexPath = IndexPath(row: textField.tag + 1, section: 0)

if let cell = tableView.cellForRow(at: nextIndexPath) as? RPTableViewCell {
    cell.textField.becomeFirstResponder()
}

编辑 文本跳转: 添加以下 textField 委托方法来存储新文本:

func textFieldDidEndEditing(_ textField: UITextField) {
    formFields?[textField.tag - 100]["displayText"] = textField.text
}