如何在不调用tableView.reloadData

问题描述

我有一个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 (将#修改为@)