[英]Swift: Why aren't my UITextFieldDelegate methods being called?
我正在嘗試以編程方式創建UITextView
並創建一個委托來處理事件。 我能夠創建add並且UITextView
很好,但是沒有一個UITextFieldDelegate
方法被添加。 為什么會這樣呢?
let myTextField = UITextField()
myTextField.frame = CGRect(x:0, y: 100, width: 300, height: 30)
myTextField.text = "Example Text"
class MyTextFieldDelegate : NSObject, UITextFieldDelegate {
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
// Hide the keyboard.
print("should return!\n")
textField.resignFirstResponder()
return true
}
func textFieldDidEndEditing(_ textField: UITextField) {
print("yay!\n")
print(textField.text! + "\n")
}
func textFieldDidBeginEditing(_ textField: UITextField) {
print("yay begin!\n")
print(textField.text! + "\n")
}
}
let myTextFieldDelegate = MyTextFieldDelegate()
myTextField.delegate = myTextFieldDelegate
scrollView.addSubview(myTextField)
在UITextField
, delegate
被聲明為weak
屬性。
weak var delegate: UITextFieldDelegate? { get set }
這意味着它不保留delegate
實例,並且在釋放delegate
時將其設置為nil
。
您正在創建delegate
並將其分配給局部變量myTextFieldDelegate
。 該變量將在函數末尾釋放,因此即使您將myTextFieldDelegate
分配給myTextField.delegate
,它也會被釋放並且myTextField.delegate
會設置為nil
因為它很弱。
要解決此問題,請在ViewController
創建一個屬性以保存委托對象:
var myTextFieldDelegate: MyTextFieldDelegate?
因為沒有人保留myTextfieldVariable ...一種方法是使用實例變量來保持對其的強烈引用
按照慣例,委托引用是弱的。 這樣可以防止保留周期。
因此,當你說
myTextField.delegate = myTextFieldDelegate
文本字段不包含對委托的擁有引用。
如果您的代碼創建myDelegate對象在方法內部:
func someFunction() {
let myTextFieldDelegate = MyTextFieldDelegate()
myTextField.delegate = myTextFieldDelegate
scrollView.addSubview(myTextField)
}
然后,變量myTextFieldDelegate
擁有對新創建的MyTextFieldDelegate
對象的強引用。 但是,一旦函數返回,變量myTextFieldDelegate
就會超出范圍。
有不再對任何強引用MyTextFieldDelegate
對象,因此它被釋放。
正如vacawama在他的評論中建議的那樣,您需要您的視圖控制器具有一個擁有強大引用的實例變量:
class MyViewController: UIViewController {
//myTextFieldDelegate is now an instance variable.
//It will hold a strong reference.
var myTextFieldDelegate: MyTextFieldDelegate?
func someFunction() {
myTextFieldDelegate = MyTextFieldDelegate()
myTextField.delegate = myTextFieldDelegate
scrollView.addSubview(myTextField)
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.