Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UITextView观察文本更改_Ios_Uikit_Uitextview_Uitextviewdelegate_Uitextinput - Fatal编程技术网

Ios UITextView观察文本更改

Ios UITextView观察文本更改,ios,uikit,uitextview,uitextviewdelegate,uitextinput,Ios,Uikit,Uitextview,Uitextviewdelegate,Uitextinput,我想收听UITextView中的每一个文本更改。设置非常简单 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) NotificationCenter.default.addObserver( self, selector: #selector(textViewDidChangeWithNotification(_:)), n

我想收听UITextView中的每一个文本更改。设置非常简单

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    NotificationCenter.default.addObserver(
        self,
        selector: #selector(textViewDidChangeWithNotification(_:)),
        name: UITextView.textDidChangeNotification,
        object: nil
    )
}

@objc private func textViewDidChangeWithNotification(_ notification: Notification) {
     print("Text: \(String(describing: inputTextView.text))")
}
它在大多数情况下都能正常工作,但我发现了一些Put的黑匣子魔法

第1步:键入“I”。我们可以在输出中看到“I”。
步骤2:重要步骤。双击字段选择所有文本。
第3步:从word建议中选择“如果”

调试器输出中没有“If”。另一方面,如果插入符号位于“I”字的末尾,我们选择“if”输出结果是否正确

有没有办法观察所有文本更改

我可以通过以下方式获取文本:

func textViewDidEndEditing(_ textView: UITextView)
但我需要实时观察所有的变化。我经常看到的另一个选择是使用:

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool

但这种观察变化的方法是一种糟糕的做法。如果您重复键入两个空格,iOS将用点替换第一个空格,并且显然不会通知您此方法中的此操作以及其他许多问题。

您可以使用
func textViewDidChangeSelection(\utextView:UITextView)
要检测选择中的更改?

如果您想监听每一个更改
shouldChangeTextIn
是一种方法。你可以写条件来解决与之相关的问题,在做了大量的研究之后,我尝试了RxSwift,因为我认为在反应范式框架中观察文本应该在100%的情况下成功。而且它没有任何问题

inputTextView.rx.text.subscribe(onNext: { string in
    print("rx: \(string)")
})
看来这些人找到了解决办法

这是一个解决方案,它为您提供有关所有文本更改的信息,而不考虑自动更正、文本选择等

class ViewController: UIViewController {

    @IBOutlet weak var inputTextView: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()
        inputTextView.textStorage.delegate = self
    }
}

extension ViewController: NSTextStorageDelegate {
    func textStorage(_ textStorage: NSTextStorage, didProcessEditing editedMask: NSTextStorage.EditActions, range editedRange: NSRange, changeInLength delta: Int) {
        print("string: \(textStorage.string)")
    }
}

是的,结果和使用NotificationCenter和UITextView.textDidChangeNotification一样。我对此有一种奇怪的感觉。这实际上给了我所需要的,我可以在插入符号位置改变后得到正确的文本,但是从函数的名称来看,我不能停止思考,在那个地方观察文本的变化是一种副作用,总有一天它会起作用。但是无论如何,谢谢你的帮助,我现在将尝试使用这种方法。不幸的是,并非所有内容都指向“shouldChangeTextIn”。在我的问题中,我描述了重复键入两个空格的情况,在这种情况下,iOS将用点替换第一个空格,而此文本更改将不会转到“shouldChangeTextIn”。另外,额外的空间插入也有问题。我不知道是用户输入的空间还是iOS自动更正。这是我见过的最疯狂的侦探作品!不错,太棒了!正是这个。不知道苹果为什么把这些事情弄得这么复杂。