2016-03-05 1 views
0

есть много похожих вопросов о текстовом поле textFields textfieldshouldreturn, которое не вызывается, но все они были решены путем установки делегата. Ive установил делегат, а также отлично показал пример в другом проекте, который я скопировал почти для линии. Операция печати подтверждает, что звонок не выполняется. Более любопытно, что я установил случайную переменную для проверки, если бы я даже обращался к правильному объекту, но когда я попытался получить доступ к этой переменной, он разбился с ошибкой BAD_ACCESS.Метод Swift 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)") 

} 

Если перечислены некоторые из различных способов, которыми я попытался установить делегата. Я даже совместил viewController с UITextFieldDelegate и установил делегат самостоятельно, но это тоже не имело значения. Я добавил «randomVariable» в TitleTextField, чтобы убедиться, что я обращаюсь к правильному объекту, но когда я использовал titleTextField.randomVariable = true в viewDidLoad, у меня произошел сбой BAD_ACCESS.

Ive также дважды проверил подключение к раскадровке. Я даже удалил соединение и IBoutlet и изменил их, никаких различий. очищенный проект и т. д.

+0

Вы попробовали перезапустить Xcode? Иногда у него есть странные проблемы, и, похоже, их исправление исправляет. – Alexander

ответ

0

Wow ok, поэтому проблема была в том, что я не задал класс текстового поля TitleTextField в моем инспекторе идентификации. Я сделал это программно, я думаю, я не понимал, что должен был сделать это и в раскадровке.

+0

А, это будет! Иногда я сталкиваюсь с этой проблемой. Рад, что вы нашли проблему! – Alexander

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, установив его как делегата.

Причина ошибки BAD_ACCESS связана с памятью. Ваш UITextField вызывает бесконечно через рекурсию. Если вы просмотрите стек вызовов, вы, вероятно, увидите, что он вызывает один и тот же метод сотни раз. См. this post для получения дополнительной информации.

+0

Вся цель моего создания нового класса заключается в том, чтобы мой ViewController не обрабатывал методы делегата текстового поля. У меня есть другой проект, в котором я использую ту же самую установку im, что и здесь, и работает отлично. –

+0

Я избавился от метода делегата и всего этого. просто поместите простой func, который печатает строку в пользовательском классе TextField, он падает с BAD ACCESS, когда я пытаюсь его вызвать. ни один делегат не используется –