Swift TextField 方法未调用,委托已设置,现在 BAD_ACCESS 错误

Posted

技术标签:

【中文标题】Swift TextField 方法未调用,委托已设置,现在 BAD_ACCESS 错误【英文标题】:Swift TextField Method Not Called, Delegate is Set, now BAD_ACCESS Errors 【发布时间】:2016-03-05 02:18:28 【问题描述】:

关于TextFields委托方法textfieldshouldreturn不被调用有很多类似的问题,但都通过设置委托解决了。我已经设置了委托,并且在另一个我几乎逐行复制的项目中也有一个非常好的示例。打印声明确认没有拨打电话。更奇怪的是,我设置了一个随机变量来测试我是否访问了正确的对象,但是当我尝试访问该变量时,它因 BAD_ACCESS 错误而崩溃。

class TitleTextField: UITextField, UITextFieldDelegate 


var randomElement: Bool = true

func textFieldShouldReturn(textField: UITextField) -> Bool 

    textField.resignFirstResponder()

    print("text field return pressed")

    return true

这是我使用它的地方

class EditViewController: UIViewController 


@IBOutlet weak var titleTextField: TitleTextField!


func configureView() 

    navigationItem.title = "Edit Goal"


override func viewDidLoad() 
    super.viewDidLoad()

    print("editor loaded")

    configureView()

    titleTextField.text = "placeholder"

    titleTextField.delegate = titleTextField
    titleTextField.delegate = titleTextField.self
    if let textField = titleTextField 

        textField.delegate = titleTextField
    

    print("textfield delegate = \(titleTextField?.delegate)")


如果列出了我尝试设置委托的一些不同方式。我什至使 viewController 符合 UITextFieldDelegate 并将委托设置为 self 但这也没关系。我将“randomVariable”添加到 TitleTextField 以确保我访问的是正确的对象,但是当我在 viewDidLoad 中使用 titleTextField.randomVariable = true 时,我遇到了 BAD_ACCESS 崩溃。

我还仔细检查了故事板连接。我什至删除了连接和 IBoutlet 并重新设置了它们,没有区别。清理项目等。

【问题讨论】:

你尝试重启 Xcode 了吗?有时它会出现奇怪的问题,重新启动似乎可以解决这些问题。 【参考方案1】:

哇,好的,所以问题是我没有在身份检查器中将文本字段类设置为 TitleTextField。我以编程方式设置了它,我想我没有意识到我也必须在情节提要中这样做。

【讨论】:

啊,你会的!我发现自己有时会遇到这个问题。很高兴您发现了问题!【参考方案2】:

问题在于您的自定义TitleTextField 本身符合UITextFieldDelegate。相反,您应该遵守 UIViewController 上的协议,如下所示:

class EditViewController: UIViewController, UITextFieldDelegate 


@IBOutlet weak var titleTextField: TitleTextField!


func configureView() 

    navigationItem.title = "Edit Goal"


override func viewDidLoad() 
    super.viewDidLoad()

    print("editor loaded")

    configureView()

    titleTextField.text = "placeholder"

    titleTextField.delegate = self

    print("textfield delegate = \(titleTextField?.delegate)")



func textFieldShouldReturn(textField: UITextField) -> Bool 

    textField.resignFirstResponder()

    print("text field return pressed")

    return true

委托的目的是响应来自文本字段 (link to docs) 的编辑相关消息。这意味着UITextField 已经知道这些编辑事件。您需要做的是允许包含您的自定义UITextField 的类监听它发送的事件。在您的情况下,该课程是EditViewController。您可以通过将EditViewController 设置为委托来让EditViewController 监听UITextView 的事件。

BAD_ACCESS 错误的原因是与内存相关的问题。您的 UITextField 通过递归无限调用自己。如果您查看调用堆栈,您可能会看到它调用了数百次相同的方法。请参阅this post 了解更多信息。

【讨论】:

我创建一个新类的全部目的是防止我的 ViewController 处理文本字段的委托方法。我有一个不同的项目,我在这里使用相同的设置,它工作正常。 我摆脱了委托方法和所有这些。只需在自定义 TextField 类中放置一个打印一行的简单函数,当我尝试调用它时它会因 BAD ACCESS 而崩溃。没有使用代表

以上是关于Swift TextField 方法未调用,委托已设置,现在 BAD_ACCESS 错误的主要内容,如果未能解决你的问题,请参考以下文章

UIImagePickerController 委托未调用 Swift 3

未调用Textfield Delegate函数

Swift 3委托函数未调用

Swift UI 委托方法不起作用

情节提要弹出框已关闭,未调用委托方法

使用 iOS 和 Swift 3 在委托方法中未接收到 xmpp 存在