首页 > 解决方案 > 如何在 TableView 中的 textView 上调用 didChange

问题描述

我在 tableView 的单元格中嵌入了一个 textView,并试图确定当用户按下完成时文本是否已更改。

当用户点击笔记时,它会从数据库中加载笔记,他们可以进行编辑,然后按完成。当他们按下完成时,我需要调用 didChange 以确保他们更改了某些内容以避免将相同的信息写回数据库。我已将我的单元格设置为 UITextFieldDelegate 并尝试设置 didChange。

import UIKit


class NoteEditTableViewCell: UITableViewCell, UITextFieldDelegate {


    @IBOutlet weak var editorView: UITextView!
    var origionalContent = ""

    var didContentChange = false

    func didChange<Value>(_ changeKind: NSKeyValueChange, valuesAt indexes: IndexSet, for keyPath: __owned KeyPath<NoteEditTableViewCell, Value>) {
        debugPrint("Content Changed")
    }
}

我无法让 didChange 调用。无论我在该字段中进行什么更改,它都不会打印调试消息。

标签: iosswiftxcodeuitextfieldios13

解决方案


您可以在此处使用回调函数。您还可以将这样的回调函数用于 tableViewCell 中的按钮点击操作。这将在 tableview 中响应。

1)在tableViewCell文件中声明回调函数。这里这个回调函数传递字符串,你可以使用任何你想要的类型,或者如果你只是想在tableview中检测这个函数调用,你可以把它留空[()->()]。

var textViewTextChangeCallback:((String) -> Void)?

2) 在 tableViewCell 文件中使用 UITextViewDelegate 和 textViewDidChange。将此扩展名放入您的 tableViewCell 文件中。在此处调用回调函数并传递您想要的任何内容。

extension NoteEditTableViewCell: UITextViewDelegate {

    func textViewDidChange(_ textView: UITextView) {
        textViewTextChangeCallback?(textView.text)
    }
 }

3) 在 ViewController 文件的 UITableViewDataSource 的 cellForRawAt 中定义回调闭包。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
     let cell = tableView.dequeueReusableCell(withIdentifier: "yourCellIdentifire") as! NoteEditTableViewCell

        cell.textViewTextChangeCallback = { [unowned self] text in
            print(text)  
            // if you want to save text on buttonClick when textViewDidChange call, create callback function for buttonClick & call its's closure here. i already show you how to define callback function follow as abov for any click you want from tableViewCell ;)
        }
    }
    return cell

}

推荐阅读