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")
    }
}