2016-12-21 49 views
2

試圖爲UITextViewDelegateUITextFieldDelegate創建自定義委託類。當我將這些類設置爲他們自己的委託,或者將其他UIKit組件設置爲他們的委託時,一切正常。但是,如果我創建自己的類作爲委託,委託方法從不會被調用。爲什麼?自定義UITextViewDelegate/UITextFieldDelegate未調用

這工作:

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,下面則拋出Error:

/// Type 'MyDelegate' does not conform to protocol 'NSObjectProtocol'

+2

嗨,你需要保持對MyDelegate類的引用,否則它會得到dealloc。 – koropok

+0

#Facepalm!我只是碰到了另一個班的這個問題。會給那一槍;謝謝! – AnthonyW

+0

@koropok回想一下,不應該'delegate'字段本身保持對MyDelegate的引用? – AnthonyW

回答

2

當您在第二種情況下設置文本字段委託時,您正在創建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") 
    } 
}