ios - 自定义 UITextViewDelegate/UITextFieldDelegate 未调用

标签 ios swift delegates swift3

尝试为 UITextViewDelegateUITextFieldDelegate 创建自定义委托(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/

相关文章:

ios - Xcode 6.1。取消选中并重新选中纵向方向。模拟器永远不会出现在纵向模式下

ios - 注册应用程序支持的文件类型以从其他应用程序打开文件

ios - swift segue 未声明的类型破坏了代码

ios - JSValue 初始化( bool :in:) vs JSValueMakeBoolean()

ios - 如何等待 NSURLConnection 委托(delegate)完成后再继续?

ios - UIView 不接受 UIViewControllers 数据

ios - 在 appDelegate 中从 didReceiveRemoteNotification 执行 segue

swift - 表达式太复杂,无法在合理的时间内解决

iphone - 如何为从应用程序中的不同位置创建的对象实现委托(delegate)

ios - 如何在 iOS Swift 中将图像从框架发送到示例项目?