У меня есть табличное представление, в котором используются пользовательские ячейки с UITextViews. Всякий раз, когда пользователь редактирует текст в текстовом представлении ячейки, а затем нажимает «Ввод», новая ячейка вставляется в список данных, которые заполняют ячейки табличного представления, и вызывается tableView.reloadData(), чтобы новая ячейка отображалась немедленно. TextView.tag + 1 ячейки, которая редактировалась, когда пользователь нажал клавишу возврата, сохраняется как переменная с именем cellCreatedWithReturn, и если эта переменная не равна нулю при перезагрузке tableView, ячейка с этим indexPath.row (поэтому новая ячейка который был только что создан) становится первым ответившим.
Проблема, с которой я сталкиваюсь, заключается в том, что когда я нажимаю «Ввод», создается новая ячейка, и она назначается в качестве первого респондента, но клавиатура отключается, потому что она начинает скрываться, а затем стреляет обратно, вместо того, чтобы просто оставаться на месте. Приложением, которое демонстрирует функциональность, которую я ищу, будет приложение Apple Reminders. Когда вы нажимаете «Ввод», создается новая ячейка, и редактирование начинается в этой новой ячейке, но клавиатура остается все время без пауз.
Одна вещь, которую я пробовал, - это закомментировать textView.endEditing(true) из моей функции shouldChangeTextIn, чтобы увидеть, было ли это причиной опускания клавиатуры, но это не привело к каким-либо изменениям.
Вот мои функции shouldChangeTextIn и cellForRowAt:
var cellCreatedWithReturn: Int?
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
if(text == "\n") {
textView.endEditing(true)
cellCreatedWithReturn = textView.tag + 1
if song.lyrics.count == textView.tag || song.lyrics[textView.tag].text != "" {
let newLyricLine = LyricLine()
newLyricLine.text = ""
do {
try realm.write {
self.song.lyrics.insert(newLyricLine, at: textView.tag)
print("Successfully inserted new lyric line in Realm")
}
} catch {
print("Error when inserting new lyric line after pressing return")
}
}
tableView.reloadData()
return false
} else {
return true
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "lyricsCell", for: indexPath) as! newNoteTableViewCell
cell.lyricsField.delegate = self
DispatchQueue.main.async {
if let newCellIndexPath = self.cellCreatedWithReturn {
if indexPath.row == newCellIndexPath {
cell.lyricsField.becomeFirstResponder()
}
}
}
}