繁体   English   中英

UITextView 观察文本变化

[英]UITextView observe text changes

我想监听 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))")
}

在大多数情况下它工作正常,但后来我发现了一些 UITextInput 的黑盒魔法。

第 1 步:输入“我”。 我们可以在 output 中看到“I”。
第二步:重要的一步。 Select 双击该字段的所有文本。
第 3 步:来自单词建议的 Select 'If'。

在此处输入图像描述

并且调试器 output 中没有“If”。 另一方面,如果插入符号位于“I”字的末尾,我们 select 'If' output 结果是正确的。

在此处输入图像描述

有什么方法可以观察所有文本的变化吗?

我可以使用以下方法获取文本:

func textViewDidEndEditing(_ textView: UITextView)

但我需要实时观察所有变化。 我经常看到的另一个选择是使用:

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

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

好的,经过大量研究后,我尝试了 RxSwift,因为我认为在反应式范式框架中观察文本应该在 100% 的情况下成功。 它没有任何问题!

inputTextView.rx.text.subscribe(onNext: { string in
    print("rx: \(string)")
})

因此,这些家伙似乎找到了解决方案。

https://github.com/ReactiveX/RxSwift/blob/master/RxCocoa/iOS/UITextView%2BRx.swift

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

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)")
    }
}

您可以使用func textViewDidChangeSelection(_ textView: UITextView)来检测选择的变化吗?

如果你想听每一个变化shouldChangeTextIn是 go 的方式。 您可以编写条件来解决与之相关的问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM