Добавление другой ячейки в табличное представление после завершения редактирования текстового представления внутри ячейки - PullRequest
0 голосов
/ 09 января 2019

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

У меня есть табличное представление с несколькими разделами, заполненными табличными ячейками, которые я создал программно. Эти пользовательские ячейки включают текстовое поле с некоторым текстом-заполнителем. Я хочу, чтобы пользователь мог нажать на текстовое поле, ввести свою запись, а затем нажать «Enter», чтобы закрыть клавиатуру, а затем создать новую ячейку под ячейкой, которую он только что отредактировал. Это очень похоже на поведение, которое происходит в приложении напоминаний.

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

1 Ответ

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

Сначала вам нужно создать способ связи между вашей ячейкой и контроллером представления. Вы можете использовать шаблон делегата или обратные вызовы для этого. Например:

final class TextFieldCell: UITableViewCell {

    // MARK: - IBOutlets
    @IBOutlet weak var textField: UITextField!

    // MARK: - Local variables
    var callback: ((_ text: String) -> Void)?

    // MARK: - Lyfecycle
    override func awakeFromNib() {
        super.awakeFromNib()
        textField.delegate = self
    }
}

Также не забудьте перезвонить нам:

extension TextFieldCell: UITextFieldDelegate {
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        callback?(textField.text!)
        return true
    }
}

Отлично! Теперь мы отправляем нашу строку из ячейки в контроллер!

Пример кода для вашего контроллера представления (упрощенная версия):

class ViewController: UIViewController {
    // MARK: - IBOutlets
    @IBOutlet weak var tableView: UITableView!

    // MARK: - Local variables
    var titles = ["Hello", "world"]
}

// MARK: - UITableViewDataSource

extension ViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return titles.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let textFieldCell = tableView.dequeueReusableCell(withIdentifier: "textFieldCell", for: indexPath) as! TextFieldCell

        textFieldCell.textField.placeholder = titles[indexPath.row]
        textFieldCell.callback = { [weak self] newTitle in // don't forget about memory leaks
            guard let `self` = self else { return }

            // calculating index path for new row
            let newIndexPath = IndexPath(row: indexPath.row + 1, section: indexPath.section)

            // appending a new row in table view
            self.titles.append(newTitle)
            self.tableView.insertRows(at: [newIndexPath], with: UITableView.RowAnimation.automatic)
        }

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