问题描述
我有一个tableView控制器,它使用带有textViews的自定义单元格。当前,我有一个回调函数,以便每当用户在编辑textView时按回车键时,都会在tableView中插入一个新单元格,它将成为第一个响应者。为了做到这一点,每当用户按下回车键时,我都会将textView的标签+1存储在一个名为cellCreatedWithReturn的变量中,以便tableView知道在何处插入该单元格以及哪个单元格是第一个响应者。问题在于,在重新加载tableView之前,最终会出现重复的textView标签。如果已经有一个标记为5的textView,而我在编辑标记为4的textView时按回车键,则会创建另一个具有textView标记为5的单元格。现在,第一个标记5位于第6行,但是由于它已被标记为5,点击return会导致在第6行而不是第7行插入一个单元格。我尝试将回调更改为仅使用indexPath.row而不是cellCreatedWithReturn变量,但这会导致新单元格始终被插入为tableView中的最后一个单元格。我不想调用tableView.reloadData(),因为这将导致键盘降低,然后在重新分配第一个响应者时立即抬起,这看起来不太好。我需要让键盘保持抬起状态。
这是我的shouldChangeTextIn,其中的回调称为:
var cellCreatedWithReturn: Int?
var returnKeyCallback: (()->())?
func textView(_ textView: UITextView,shouldChangeTextIn range: NSRange,replacementText text: String) -> Bool {
if(text == "\n") {
cellCreatedWithReturn = textView.tag + 1
print(cellCreatedWithReturn!)
returnKeyCallback?()
return false
} else {
return true
}
}
以及cellForRowAt中的回调函数:
self.returnKeyCallback = { [weak self] in
if let self = self {
let newRow = self.cellCreatedWithReturn! - 1
// this is -1 because cell 0 is not included in the same data source
do {
try self.realm.write {
self.song.lyrics.insert(LyricLine(),at: newRow)
}
} catch {
print("Error when inserting new lyric line to song in Realm when return pressed")
}
let newIndexPath = IndexPath(row: self.cellCreatedWithReturn!,section: 0)
print(newIndexPath.row)
self.tableView.performBatchUpdates({
self.tableView.insertRows(at: [newIndexPath],with: .automatic)
},completion: { b in
guard let c = tableView.cellForRow(at: newIndexPath) as? newNoteTableViewCell else { return }
c.lyricsField.becomeFirstResponder()
c.lyricsField.tag = self.cellCreatedWithReturn!
if indexPath.row > newIndexPath.row {
cell.lyricsField.tag += 1
}
})
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)