【问题标题】:UITextView observe text changesUITextView 观察文本变化
【发布时间】:2020-10-06 16:57:30
【问题描述】:

我想监听 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 步:“我”输入了。我们可以在输出中看到“I”。
步骤 2: 重要步骤。双击字段选择所有文本。
第 3 步:从单词建议中选择“如果”。

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

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

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

func textViewDidEndEditing(_ textView: UITextView)

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

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

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

【问题讨论】:

    标签: ios uikit uitextview uitextviewdelegate uitextinput


    【解决方案1】:

    好的,经过大量研究后,我尝试了 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)")
        }
    }
    

    【讨论】:

    • 这是我见过的最疯狂的侦探作品!不错。
    • 太棒了!正是需要这个。想知道为什么 Apple 让这些事情变得如此复杂。
    【解决方案2】:

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

    【讨论】:

    • 是的,结果和使用NotificationCenter和UITextView.textDidChangeNotification一样。
    • 对此我有一种奇怪的感觉。这实际上给了我我需要的东西,我可以在插入符号位置发生变化后得到正确的文本,但是从函数的名称来看,我不能停止认为在那个地方观察文本变化是一种副作用,有一天它会发挥作用.但无论如何感谢您的帮助,我现在会尝试使用这种方法。
    【解决方案3】:

    如果您想了解每一个变化,shouldChangeTextIn 是您的最佳选择。您可以编写条件来解决与之相关的问题

    【讨论】:

    • 嗨。不幸的是,并非所有内容都转到“shouldChangeTextIn”。在我的问题中,我描述了重复键入两个空格的情况,在这种情况下,iOS 将用点替换第一个空格,并且此文本更改不会转到“shouldChangeTextIn”。插入额外的空间也存在问题。我不知道是用户输入的空格还是 iOS 自动更正。
    猜你喜欢
    • 1970-01-01
    • 2019-06-30
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 2020-07-29
    • 1970-01-01
    • 2012-08-05
    • 2014-02-15
    相关资源
    最近更新 更多