2016-03-05 47 views
0

有许多关于TextFields委托方法textfieldshouldreturn未被调用的类似问题,但都是通过设置委托来解决的。我已经设置了委托,并且在另一个项目中我已经完全复制了几乎一行的项目。打印语句确认没有进行呼叫。更让人好奇的是,我设置了一个随机变量来测试我是否访问了正确的对象,但是当我尝试访问该变量时,它会因BAD_ACCESS错误而崩溃。Swift TextField方法未调用,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,但这也没有关系。我向TitleTextField添加了“randomVariable”以确保我访问正确的对象,但是当我在viewDidLoad中使用titleTextField.randomVariable = true时,我得到了一个BAD_ACCESS崩溃。

我也双重检查了故事板连接。我甚至删除了连接和IBoutlet并重新编号,没有任何区别。清理后的项目等

+0

您是否尝试重新启动Xcode?有时它有奇怪的问题,重启似乎可以解决它们。 – Alexander

回答

0

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

+0

啊,那会得到你!我发现自己有时会遇到这个问题。很高兴你发现了这个问题! – Alexander

0

问题是,您的自定义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了解更多信息。

+0

我创建一个新类的全部目的是让我的ViewController不会处理文本字段的委托方法。我有一个不同的项目,我使用这里使用相同的设置即时通讯,它工作正常。 –

+0

我摆脱了委托方法和所有。只是放一个简单的func在自定义TextField类中打印一行,当我尝试调用它时,它会与BAD ACCESS一起崩溃。没有代表正在使用 –