ios - 在单独的类中实现 UITextFieldDelegate

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

最佳答案

注意delegate的声明:

unowned(unsafe) var delegate: UITextFieldDelegate?

MyTextFieldDelegate() 被创建,分配给 delegate,然后在 createUI() 返回时释放。它被 ARC 释放,因为没有人拥有它。您遇到的问题正是 unsafe 警告您的问题。

您需要创建对 MyTextFieldDelegate 实例的强引用。您还需要保证在解除分配文本字段之前不会解除分配委托(delegate)。

Note the difference between this behavior and weak. If the delegate were weak instead of unowned(unsafe), then it would become nil and never get called, instead of crashing when it's called.

关于ios - 在单独的类中实现 UITextFieldDelegate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28032973/

相关文章:

ios - 应用程序在从库中选择媒体时崩溃,但将 nil 元素插入到数组中除外

ios - SwiftUI:在 iOS 14 中应用 `Text.init(_:style:)` 时, `.cornerRadius` 不会自动更新

ios - 如何在 Storyboard 失败的情况下使用大量表格 View 单元格和自动布局约束来布局复杂 View

ios - 'kUTTypeFlatRTFD' 是否已重命名?

swift - 在数组的 Observable 中组合 Observable

ios - Swift - 如何识别单击和双击之间的区别

ios - 使用 UIGesturerecognizer 或其他方式移动时如何知道 subview 是否相交?

ios - Xcode 中 Storyboard 模式下的页面是否有限制

ios - Xcode Swift UI 侧边菜单内容未对齐

ios - 在 GADBannerView 内调整图像大小