клавиша возврата, нажатая внутри uitableviewcell swift

#swift #uitableview #textfield

#swift #uitableview #текстовое поле

Вопрос:

У меня есть текстовое поле в каждой ячейке моего tableview. Я хочу выйти из клавиатуры, когда пользователи нажимают клавишу возврата. Я пытался:

 func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    textField.resignFirstResponder()

    return true
}
 

Но это не работает, и я, похоже, не могу найти ссылку на текстовое поле внутри ячейки моего tableview. Пожалуйста, помогите, спасибо!

Ответ №1:

Я предполагаю, что вы создали IBOutlets свое текстовое поле в своем классе cell.
Предоставьте свой делегат текстового поля self в cellForRow методе источника данных UITableView

 cell.yourTextField.delegate = self
 

Ответ №2:

Вы можете предоставить раскадровку формы делегата.

Ответ №3:

Вы должны разрешить вашему пользовательскому UITableViewCell классу подтверждать UITextFieldDelegate :

 class TableViewCell: UITableViewCell, UITextFieldDelegate {
    // ...
}
 

В awakeFromNib этом случае ваши текстовые поля должны делегироваться классу cell:

 override func awakeFromNib() {
    // ...

    textField.delegate = self

    // ...
}
 

Наконец, реализовать textFieldShouldReturn :

 func textFieldShouldReturn(_ textField: UITextField) -> Bool {

    textField.resignFirstResponder()

    return true
}
 

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

Комментарии:

1. это неправильно. Если в awakeFromNib нем реализовано, оно не будет частью ViewController , а будет только частью пользовательской ячейки, текстовое поле которой находится в таблице. Он должен быть в cellForRow

2. @RajanMaheshwari С архитектурной точки зрения, позволять уровню контроллера обрабатывать компоненты ячейки не очень хорошая идея, это подчеркивает теорию «Массивных контроллеров представления» .

3. Брат, это связано с self . Вы не можете преобразовать self в класс customcell. Если вы создаете, то вам нужно реализовать UITextFieldDelegate в пользовательской ячейке. И дело не в компонентах. Вы можете обрабатывать элементы макета проектирования awakeFromNib , но в случае делегирования возникает право собственности. Если вы реализуете делегирование self в пользовательском классе cell, то вам нужно снова передать это через делегат в вашем ViewController , который действует как дополнительные накладные расходы.

4. @RajanMaheshwari Я надеюсь, что вы не расстроены этим обсуждением, потому что я совсем не расстроен 🙂 Подтверждая, что textFieldShouldReturn реализован в пользовательском классе cell, «Если вы реализуете делегирование для self в пользовательском классе cell, вам нужно снова передать это через делегат в вашем ViewController, который действует как дополнительные накладные расходы» не могли бы вы попробовать сделать это самостоятельно (добавить текстовое поле в ячейку и реализовать, добавитьТекстовое поле. делегируйте = self для awakeFromNib и реализуйте TextFields shouldreturn), он отлично работает без необходимости передачи его контроллеру.

5. что делать, если что-то нужно изменить ViewController , скажем, изменить цвет кнопки или, скажем, обновить какую-то метку, которая является частью ViewController`при каждом нажатии клавиши return. Затем вам нужно передать что-то из textFieldShouldReturn делегата в ваш класс контроллера. В основном другой делегат или какое-то уведомление или какое-то закрытие