簡體   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