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


关于 TextFields 委托方法 textfield应该返回

textfield应该返回 不被调用,有很多类似的问题,但都是通过设置委托来解决的。我设置了委托,并且在我几乎逐行复制的另一个项目中也有一个非常好的例子。打印语句确认未进行呼叫。更奇怪的是,我设置了一个随机变量来测试我是否访问了正确的对象,但是当我尝试访问该变量时,它崩溃了,并出现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)")
}

如果列出了一些不同的方法,我尝试设置委托。我甚至将视图控制器符合UITextFieldDelegate并将委托设置为self,但这也无关紧要。我在 TitleTextField 中添加了"randomVariable"以确保我访问了正确的对象,但是当我在 viewDidLoad 中使用 titleTextField.randomVariable = true 时,我遇到了BAD_ACCESS崩溃。

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

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

问题是您符合自定义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
}

委托的目的是响应文本字段中与编辑相关的消息(指向文档的链接)。这意味着UITextField已经知道这些编辑事件。您需要做的是允许包含自定义UITextField的类侦听它发出的事件。在您的情况下,该类是EditViewController .您可以通过将其设置为委托来EditViewController收听UITextView的事件。

BAD_ACCESS错误的原因是与内存相关的问题。你的UITextField通过递归无限地调用自己。如果您浏览调用堆栈,您可能会看到它调用相同的方法数百次。有关更多见解,请参阅此帖子。

最新更新