UITextField в UITableViewCell отказывается стать первым респондентом - PullRequest
0 голосов
/ 05 мая 2020

Когда я создаю новый объект и вставляю для него новую ячейку в UITableView с использованием настраиваемого класса UITableViewCell, я хочу, чтобы одно из текстовых полей в новой ячейке стало первым респондентом, чтобы пользователь мог сразу же начать вводить данные , без необходимости нажимать на что-либо дальше.

Вот моя попытка заставить это работать:

        tableView.insertRows(at: [indexPath], with: UITableView.RowAnimation.automatic)
        if let cell = tableView(tableView, cellForRowAt: indexPath) as? CustomCell {
            print(cell.ibOutletField.becomeFirstResponder())
        }

Однако это всегда печатает false, и поле не становится первым респондентом ( и клавиатура не отображается).

Обратите внимание, что функция awakeFromNib() этого настраиваемого класса ячеек вызывается перед becomeFirstResponder(), поэтому моя переменная UITextField должна быть связана с фактическим текстовым полем. Я также пробовал запустить reloadData() в табличном представлении непосредственно перед вызовом becomeFirstResponder(), но это не помогло.

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

Как мне заставить UITextField стать первым респондентом сразу после того, как UITableViewCell, в который он включен, будет добавлен в UITableView?

Обратите внимание, что вызов becomeFirstResponder() в текстовом поле прямо внутри ячейки awakeFromNib() ДЕЙСТВИТЕЛЬНО работает. Но это не обязательно то, что я хочу. Это всегда будет приводить к тому, что последняя ячейка будет первым ответчиком, независимо от того, предназначен ли он для нового объекта или нет, тогда как я хочу, чтобы это происходило только для недавно вставленной ячейки (которая может быть последней, а может и не быть).

ОБНОВЛЕНИЕ - Другая ситуация, в которой поле ячейки отказывается стать первым респондентом, но на этот раз в таблицу не добавляются новые строки.

В этом случае, если пользователь нажимает " RETURN "при редактировании последнего поля ячейки, а ячейка НЕ ​​является последней ячейкой в ​​таблице, я хочу, чтобы первое поле СЛЕДУЮЩЕЙ ячейки стало первым ответчиком. Однако это тоже не работает:

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        ...
        ...
        ...
                    let nextIndexPath = IndexPath(row: indexPath.row + 1, section: indexPath.section)
                    if let nextCell = tableView(tableView, cellForRowAt: nextIndexPath) as? CustomCell {
                        print("Field text:  '\(nextCell.quantityField.text ?? "(no text)")'")
                        //  THIS DOESN'T WORK!!!
                        print(nextCell.quantityField.becomeFirstResponder())
                    }
                }
            }
        }
        return true
    }

В этом случае вывод на консоль XCode:

Текст поля: '333'

false

Этот текст «333» дает понять, что он нашел нужное поле в правой ячейке, но не стал первым респондентом (а «false» указывает, что он явно отказался так и сделай).

...