尝试为 UITextViewDelegate
和 UITextFieldDelegate
创建自定义委托(delegate)类。当我将这些类设置为它们自己的委托(delegate),或将另一个 UIKit 组件设置为它们的委托(delegate)时,一切正常。但是,如果我创建自己的类来充当委托(delegate),则永远不会调用委托(delegate)方法。为什么?
这有效:
class MyTextView: UITextView, UITextViewDelegate {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.delegate = self
}
func textViewDidChange(_ textView: UITextView) {
print("I work")
}
这不会:
class MyTextView: UITextView {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.delegate = MyDelegate()
}
class MyDelegate: NSObject, UITextViewDelegate {
func textViewDidChange(_ textView: UITextView) {
print("I work")
}
}
注意:如果MyDelegate
没有子类化NSObject
,则会抛出以下错误:
///类型“MyDelegate”不符合协议(protocol)“NSObjectProtocol”
最佳答案
当您在第二种情况下设置文本字段委托(delegate)时,您正在创建 MyDelegate() 类的弱引用。您可以检查以下代码,这将通过创建 MyDelegate() 的强引用来解决您的问题。
class MyTextView: UITextView {
var responseDelegate = MyDelegate()
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.delegate = responseDelegate
}
}
class MyDelegate: NSObject, UITextViewDelegate {
func textViewDidChange(_ textView: UITextView) {
print("I work")
}
}
关于ios - 自定义 UITextViewDelegate/UITextFieldDelegate 未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41253656/