在单独的类中实现UITextFieldDelegate

时间:2015-01-19 20:28:05

标签: 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;
  }
}

但这不是:

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;
  }
}

1 个答案:

答案 0 :(得分:7)

请注意delegate的声明:

unowned(unsafe) var delegate: UITextFieldDelegate?

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

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

  

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