Ios 未调用自定义UITextViewDelegate/UITextFieldDelegate
正在尝试为Ios 未调用自定义UITextViewDelegate/UITextFieldDelegate,ios,swift,delegates,swift3,Ios,Swift,Delegates,Swift3,正在尝试为UITextViewDelegate和UITextFieldDelegate创建自定义委托类。当我将这些类设置为它们自己的委托,或者将另一个UIKit组件设置为它们的委托时,一切都正常。但是,如果我创建自己的类作为委托,则永远不会调用委托方法。为什么? 这是有效的: class MyTextView: UITextView, UITextViewDelegate { required init?(coder aDecoder: NSCoder) { super.init(c
UITextViewDelegate
和UITextFieldDelegate
创建自定义委托类。当我将这些类设置为它们自己的委托,或者将另一个UIKit组件设置为它们的委托时,一切都正常。但是,如果我创建自己的类作为委托,则永远不会调用委托方法。为什么?
这是有效的:
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
,将引发以下错误:
///在第二种情况下设置文本字段delegate时,类型“MyDelegate”不符合协议“NSObjectProtocol”
创建MyDelegate()类的弱引用。您可以检查以下代码,这将通过创建MyDelegate()的强引用来解决您的问题
您好,您需要保留对MyDelegate类的引用,否则它将获得dealloc。#Facepalm!我刚刚在另一个班遇到了这个问题。我会试一试;谢谢@koropok回顾一下,
delegate
字段本身不应该保留对MyDelegate的引用吗?在通常的Cocoa/Cocoa Touch类中,delegate
只保留弱引用。为了使代理正常工作,需要将其保存在其他地方,并带有强引用。我刚刚测试过,保存强引用将有效,就像@OOPer所说的那样。
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")
}
}