didEndEditingRowAt не вызывается с настраиваемой ячейкой таблицы - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть просмотр таблицы (SettingsViewController), который я использую как представление информации о пользователе, где отображается информация о пользователе (имя, адрес электронной почты, номер телефона и т. Д.). Это похоже на стандартную страницу контактов iOS.

В каждой ячейке есть текстовое поле, растянутое по размеру ячейки, чтобы в режиме «редактирования» пользователь мог обновить свою информацию.

У меня также есть пользовательская ячейка (SettingsCell), в которой я настраиваю ячейку с текстовым полем и т. Д.

SettingsViewController (исключено много кода установки tabelview):

class SettingsViewController: UITableViewController{

    let cellId = "cellId"

    var apiController: APIController?

    var firstName: String?
    var lastName: String?
    var email: String?
    var phoneNumber: String?

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .mainWhite()
        tableView = UITableView(frame: CGRect.zero, style: .grouped)
        tableView.register(SettingsCell.self, forCellReuseIdentifier: cellId)

        setupNavigation()

    }

    fileprivate func setupNavigation() {
        editButtonItem.action = #selector(showEditing)
        editButtonItem.title = "Edit"
        editButtonItem.tintColor = .mainWhite()
        self.navigationItem.rightBarButtonItem = editButtonItem
    }


    @objc func showEditing(sender: UIBarButtonItem)
    {
        if(self.tableView.isEditing == false)
        {
            self.tableView.isEditing = true
            self.navigationItem.rightBarButtonItem?.title = "Save"
            self.tableView.reloadData()
        }
        else
        {
            self.tableView.isEditing = false
            self.navigationItem.rightBarButtonItem?.title = "Edit"
            self.tableView.reloadData()
        }
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! SettingsCell

        if self.tableView.isEditing == true {
            cell.textField.isEnabled = true

            if indexPath.section == 2 {
                cell.textField.keyboardType = .phonePad
            }
        } else {
            cell.textField.isEnabled = false
        }

        cell.selectionStyle = .none

        filloutUserInfo(indexPath: indexPath, cell: cell)

        return cell
    }

    override func tableView(_ tableView: UITableView, shouldIndentWhileEditingRowAt indexPath: IndexPath) -> Bool {
        return false
    }

    //THIS NEVER GETTING EXECUTED
    override func tableView(_ tableView: UITableView, didEndEditingRowAt indexPath: IndexPath?) {
        print("editing done for row \(indexPath?.item)")
    }

    override func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
        return .none
    }

}

Настройки ячейки:

class SettingsCell: UITableViewCell, UITextFieldDelegate {

    let textField: UITextField = {
        let tf = UITextField()
        tf.isEnabled = false
        return tf
    }()

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        addSubview(textField)
        textField.anchor(top: topAnchor, left: leftAnchor, bottom: bottomAnchor, right: rightAnchor, paddingTop: 0, paddingLeft: 8, paddingBottom: 0, paddingRight: 8, width: 0, height: 0)

        textField.addDoneButtonOnKeyboard()
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

Проблема, с которой я сейчас столкнулся, заключается в том, что после того, как я перешел в режим редактирования и изменил текст данной ячейки, табличное представление фактически не распознает это. DidEndEditingRowAt никогда не вызывается, и этот оператор печати никогда не отображается. Я подозреваю, что это как-то связано с тем, что текстовое поле никак не связано с контроллером таблиц, но я не уверен, как это исправить.

Мне нужно знать, когда пользователь закончил редактирование, чтобы отобразить предупреждение о неправильном форматировании и отключении кнопки сохранения.

1 Ответ

0 голосов
/ 11 сентября 2018

Вам необходимо реализовать обратный вызов для прослушивания события textField endEditing от SettingsCell до вашего ViewController.

Чтобы добиться этого, вот обновленный SettingsCell

class SettingsCell: UITableViewCell, UITextFieldDelegate {

    let textField: UITextField = {
        let tf = UITextField()
        tf.isEnabled = false
        tf.addDoneButtonOnKeyboard()
        return tf
    }()

    public var onEndEditing: ((String?) -> Void)?

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        textField.removeFromSuperview()
        addSubview(textField)
        textField.delegate = self

        textField.anchor(top: topAnchor, left: leftAnchor, bottom: bottomAnchor, right: rightAnchor, paddingTop: 0, paddingLeft: 8, paddingBottom: 0, paddingRight: 8, width: 0, height: 0)
    }

    func textFieldDidEndEditing(_ textField: UITextField) {
        self.onEndEditing?(textField.text)
    }

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

Теперь обновите cellForRowAt, чтобы прослушать событие endEditing, как показано ниже,

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath) as! SettingsCell

    if self.tableView.isEditing == true {
        cell.textField.isEnabled = true
        cell.onEndEditing = { text in 
            print("Cell Editing finished with text: \(text)")
         }
        if indexPath.section == 2 {
            cell.textField.keyboardType = .phonePad
        }
    } else {
        cell.textField.isEnabled = false
    }

    cell.selectionStyle = .none

    filloutUserInfo(indexPath: indexPath, cell: cell)

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