После того, как любая строка удалена с помощью deleteRows(at:with:)
из моего табличного представления, я не могу получить текстовое поле в многократно используемой пользовательской ячейке, чтобы получить фокус на becomeFirstResponder()
(который вызывается после вызова insertRows(at:with:)
).becomeFirstResponder()
всегда вызывается в cellForRow(at:)
.
Эта проблема всегда возникает после удаления строки из табличного представления с помощью deleteRows(at:with:)
.Перед удалением какой-либо строки проблем нет, becomeFirstResponder()
может выделить фокус на текстовое поле, как и предполагалось.
Я провел несколько тестов, чтобы понять, почему эта проблема возникает после удаления строки ... Мои тесты показалиИнтересная разница:
Случай 1 : после удаления любой строки (т. е. пока becomeFirstResponder()
возвращает false), textFieldShouldBeginEditing(_:)
вызывается ДО cellForRow(at:)
возвращается.textFieldDidBeginEditing(_:)
никогда не вызывается.
Случай 2 : С другой стороны, перед удалением какой-либо строки (т. Е. Пока becomeFirstResponder()
возвращает значение true), textFieldShouldBeginEditing(_:)
называется ПОСЛЕ cellForRow(at:)
возвращается.textFieldDidBeginEditing(_:)
вызывается сразу после textFieldShouldBeginEditing(_:)
, как и ожидалось.
Возможно, проблема связана с этим различием, но я не мог разгадать эту загадку после многочасовых попыток и исследований.
В связанных вопросах и ответах предлагается не перезагружать tableView из textFieldDidEndEditing()
.В моем случае метод deleteRows(at:with:)
иногда вызывается изнутри textFieldDidEndEditing()
, а иногда вызывается из tableView(_:commit:forRowAt:)
(т. Е. Смахиванием влево).Так что это не объясняет мою проблему.Другой связанный Q & A может быть этот .
getFocus () в классе CustomCell, вызывается из cellForRow(at:)
в TableViewController:
func getFocus() {
if let itemTextField = itemTextField {
itemTextField.delegate = self
itemTextField.isUserInteractionEnabled = true
itemTextField.becomeFirstResponder()
}
}
cellForRow(at:)
:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let item = items[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell", for: indexPath) as! CustomCell
cell.setCell(item: item)
cell.delegate = self
if insertingRow == true {
if isTempItem(item: item, indexPath: indexPath) {
cell.getFocus()
} else {
print("isTempItem returned false, no need to give focus.")
}
}
return cell
}