繁体   English   中英

UITextView 如何在没有委托的情况下监听自己的更改

[英]How can a UITextView listen on its own changes without delegate

我正在制作一个自定义 UITextView 子类。 目的是支持占位符,而不是原生支持 UITextView。 文本视图需要监听自己的变化,以便显示/隐藏占位符 label。 但我不能使用委托,因为用户 class 可能会将委托重置为自身。 在没有任何委托方法的情况下如何实现这一点?

您不能使用delegate似乎有点奇怪,并且可能值得检查没有更好的架构允许它,但如果它不可行,您可以使用通知来提醒您textView中的活动。

TextViews 发出textDidBeginEditingNotificationtextDidChangeNotificationtextDidEndEditingNotification

您可以订阅这些通知,将文本值与存储的版本进行比较,并做出相应的响应。

此页面上的详细信息: textView 通知的 Apple 文档

您可以监听文本值的变化,并对其采取行动。 如果至少有一个字符,那么我们隐藏占位符,如果有 0 个字符,我们取消隐藏占位符。

class CustomTextView: UITextView {

   override var text: String! {
        didSet (newValue) {
            let shouldHide = newValue.count > 0
            placeholder.isHidden = shouldHide
        }
    }
}

但我不能使用委托,因为用户 class 可能会将委托重置为自身。 在没有任何委托方法的情况下如何实现这一点?

为什么会这样做? 您是否将YourTextView.delegate = self放在多个地方? 您是否已经尝试过委托?

这是代表的代码:

func textViewDidEndEditing(_ textView: UITextView) {

}

如果您真的不想使用委托,您可以使用一个计时器来非常频繁地检查 textview 并将其与您存储的先前值进行比较。 您还可以检查键盘操作,然后检查 textview。

let timer = Timer(timeInterval: 0.0, repeats: true) { _ in 
 //put a conditional here that compares the textview text to the previously stored value
 }

暂无
暂无

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

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