簡體   English   中英

斯威夫特:為什么不調用我的UITextFieldDelegate方法?

[英]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)

UITextFielddelegate被聲明為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM