在单独的类中实现UITextFieldDelegate

Nic*_*olt 7 ios swift

我想UITextFieldDelegate在一个独立的类中实现,UIViewController但是当我这样做时,我EXC_BAD_ACCESS在运行时得到一个异常.

那为什么这个工作:

class MyViewController : UIViewController, UITextFieldDelegate
{
  ...

  func createUI()
  {
    let someTextField: UITextField = UITextField()
    someTextField.delegate = self

    ...
  }

  func textFieldShouldReturn(textField: UITextField!) -> Bool
  {
    textField.resignFirstResponder()
    return true;
  }
}
Run Code Online (Sandbox Code Playgroud)

但这不是:

class MyViewController : UIViewController
{
  ...

  func createUI()
  {
    let someTextField: UITextField = UITextField()
    someTextField.delegate = MyTextFieldDelegate()

    ...
  }
}

class MyTextFieldDelegate : NSObject, UITextFieldDelegate
{
  func textFieldShouldReturn(textField: UITextField!) -> Bool
  {
    textField.resignFirstResponder()
    return true;
  }
}
Run Code Online (Sandbox Code Playgroud)

Aar*_*ger 7

请注意以下声明delegate:

unowned(unsafe) var delegate: UITextFieldDelegate?
Run Code Online (Sandbox Code Playgroud)

MyTextFieldDelegate()delegatecreateUI()返回时创建,分配,然后取消分配.它被ARC取消分配,因为没有任何东西拥有它.您遇到的问题正是unsafe警告您的问题.

您需要为MyTextFieldDelegate实例创建强引用.您还需要保证在取消分配文本字段之前不会释放委托.

注意这种行为与之间的区别weak.如果委托weak代替unowned(unsafe),那么它将变为nil并且永远不会被调用,而不是在被调用时崩溃.