Ios UITextView观察文本更改
我想收听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
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自动更正。这是我见过的最疯狂的侦探作品!不错,太棒了!正是这个。不知道苹果为什么把这些事情弄得这么复杂。