Swift 未调用 TextField 方法,已设置委托,现在 BAD_ACCESS 错误
Swift TextField Method Not Called, Delegate is Set, now BAD_ACCESS Errors
关于TextFields delegate 方法textfieldshouldreturn not being called 类似的问题有很多,但是都通过设置delegate 解决了。我设置了委托,并且在我几乎逐行复制的另一个项目中也有一个非常好的例子。打印语句确认没有调用。更奇怪的是,我设置了一个随机变量来测试我是否访问了正确的对象,但是当我尝试访问该变量时,它因 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 并重做了它们,没有区别。清理项目等
问题是您在自定义 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
的 class 收听它发送的事件。在您的情况下,class 是 EditViewController
。您可以通过将 EditViewController
设置为委托来让 EditViewController
监听 UITextView
的事件。
您的 BAD_ACCESS 错误的原因是与内存相关的问题。您的 UITextField
正在通过递归无限地调用自己。如果您查看调用堆栈,您可能会看到它调用了同一个方法数百次。请参阅 this post 了解更多信息。
哇,好的,所以问题是我没有在我的身份检查器中将文本字段 class 设置为 TitleTextField。我以编程方式设置了它,我想我没有意识到我也必须在情节提要中这样做。
关于TextFields delegate 方法textfieldshouldreturn not being called 类似的问题有很多,但是都通过设置delegate 解决了。我设置了委托,并且在我几乎逐行复制的另一个项目中也有一个非常好的例子。打印语句确认没有调用。更奇怪的是,我设置了一个随机变量来测试我是否访问了正确的对象,但是当我尝试访问该变量时,它因 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 并重做了它们,没有区别。清理项目等
问题是您在自定义 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
的 class 收听它发送的事件。在您的情况下,class 是 EditViewController
。您可以通过将 EditViewController
设置为委托来让 EditViewController
监听 UITextView
的事件。
您的 BAD_ACCESS 错误的原因是与内存相关的问题。您的 UITextField
正在通过递归无限地调用自己。如果您查看调用堆栈,您可能会看到它调用了同一个方法数百次。请参阅 this post 了解更多信息。
哇,好的,所以问题是我没有在我的身份检查器中将文本字段 class 设置为 TitleTextField。我以编程方式设置了它,我想我没有意识到我也必须在情节提要中这样做。