微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在不调用tableView.reloadData

如何解决如何在不调用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 举报,一经查实,本站将立刻删除。