Добавить цель в UITextField в UITableview (Swift) - PullRequest
0 голосов
/ 10 марта 2019

Я хочу проверить, когда пользователь начинает редактировать текстовое поле. Существует отличный четкий ответ о том, как это сделать здесь .

Однако в моем случае мой textField находится внутри UITableview, который настроен как его собственный класс. Я пробовал много разных способов, чтобы заставить это работать, но я продолжаю получать сбой "libc ++ abi.dylib: завершение с неперехваченным исключением типа NSException" Я помещаю разрыв в функцию textFieldDidChange, и он никогда не вызывается так Кажется, проблема в том, как я называю эту функцию от цели.

class TextFieldCell: UITableViewCell {

    lazy var textField: UITextField = {
        let tf = UITextField()
        tf.translatesAutoresizingMaskIntoConstraints = false
        tf.textAlignment = .center
        tf.textColor = .black
        tf.font = UIFont.systemFont(ofSize: 17)
        tf.clearButtonMode = .whileEditing
        return tf
    }()

    // For simplicity, the rest of the Cell setup not shown.
    // Adds target in AirInput VC to fire method when editing happens

    textField.addTarget(self, action: #selector(AirInputViewController.textFieldDidChange(_:)), for: UIControl.Event.editingChanged)

}


class AirInputViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate {

    @objc func textFieldDidChange(_ textField: UITextField) {

    }

}

Я также попробовал следующее для цели, и она тоже вылетает.

textField.addTarget(AirInputViewController.self, action: #selector(AirInputViewController.textFieldDidChange(_:)), for: UIControl.Event.editingChanged)

Такое ощущение, что мне не хватает чего-то простого, но я понятия не имею, что это за простое исправление. Или, возможно, я должен добавить цель в AirInputViewContoller? Если да, то как мне получить доступ к UITableViewCells, где находится текстовое поле? Спасибо!

1 Ответ

1 голос
/ 10 марта 2019

Вероятно, вы столкнулись с тем, что вы делаете:

textField.addTarget(self, action: #selector(AirInputViewController.textFieldDidChange(_:)), for: UIControl.Event.editingChanged)

Здесь self равно TextFieldCell, поэтому я думаю, что он пытается пойти и проверить, что AirInputViewController находится внутри TextFieldCell, но это не так.

Я бы сделал:

class TextFieldCell: UITableViewCell {

    weak var delegate: TextFieldCellDelegate?

    lazy var textField: UITextField = {
        // same you have
    }()

    textField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: UIControl.Event.editingChanged)

    @objc func textFieldDidChange(_ textField: UITextField) {
        delegate?.textFieldDidChange(textField)
    }

Создаю необычного делегата:

protocol TextFieldCellDelegate: class {
     func textFieldDidChange(_ textField: UITextField)
}

class AirInputViewController: TextFieldCellDelegate {

    func textFieldDidChange(_ textField: UITextField) {
        // textField just changed!
    }

    // IMPORTANT! Set the delegate for the cell!

    func tableView(...cellForRow...) {
        let cell = ... as! TextFieldCell
        cell.delegate = self
        ...
        return cell
    }
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...