Когда я создаю новый объект и вставляю для него новую ячейку в 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» указывает, что он явно отказался так и сделай).