Несколько textFields в UITableView обновляют неправильный textField, когда textFieldShouldReturn - PullRequest
0 голосов
/ 04 января 2019

Я делаю форму через UITableView, используя пользовательские UITableViewCell s, которые содержат UITextField каждый.

Я использую textFieldShouldReturn для перехода к следующему текстовому полю, но я не могу понять, почему то, что я набрал в одном текстовом поле, появляется случайно (на самом деле, странный шаблон) в другом текстовом поле.

Здесь пользовательский 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
    }

EDIT:

В 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]]

1 Ответ

0 голосов
/ 04 января 2019

Вы используете следующий фрагмент, который не работает:

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

Текстовое поле не является подпредставлением вашего tableView. Текстовое поле является подпредставлением 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
}
...