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

时间:2016-03-05 02:18:29

标签: swift textfield exc-bad-access

有很多类似的问题关于TextFields委托方法textfieldshouldreturn not not called,但所有问题都是通过设置委托来解决的。我已经设置了代表,并且在另一个项目中有一个非常好的例子,我已经几乎逐行复制了。打印声明确认没有打电话。更奇怪的是我设置了一个随机变量来测试我是否正在访问正确的对象,但是当我尝试访问该变量时,它崩溃了一个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并重新编写它们,没有区别。清理项目等。

2 个答案:

答案 0 :(得分:1)

哇好吧,问题是我没有在我的身份检查器中将textfield类设置为TitleTextField。我以编程方式设置了它,我想我没有意识到我必须在故事板中这样做。

答案 1 :(得分:0)

问题在于您是否符合自定义UITextFieldDelegate本身的TitleTextField。相反,您应该遵守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通过将UITextView的事件设置为代理来监听UITextField的事件。

BAD_ACCESS错误的原因是与内存相关的问题。你的<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_margin="10dp" android:background="?android:selectableItemBackgroundBorderless" android:clickable="true" android:orientation="vertical"> <ImageView android:id="@+id/iconSpot" android:layout_width="44dp" android:layout_height="44dp" android:layout_gravity="center_horizontal" android:src="@drawable/ic_launcher" tools:ignore="MissingPrefix" /> <TextView android:id="@+id/textLabel" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="Dummy Text" android:textSize="16sp" /> </LinearLayout> 通过递归无限地调用自己。如果你查看调用堆栈,你可能会看到它调用相同的方法数百次。有关更多信息,请参阅this post