我有一个文本字段,我想在用户按下返回按钮时隐藏。 textfield是在界面构建器中创建的,我在.h文件中添加了textfield委托,并将textfield的委托设置为文件所有者。
@interface ProfileEdit : UIViewController<UITextFieldDelegate>{
UITextField *textfield1;
UITextField *textfield2;
UITextField *textfield3;
}
- (void)viewDidLoad
{
textfield1 = [[UITextField alloc] initWithFrame:CGRectMake(20, 49, 164, 31)];
[textfield1 setDelegate:self];
[textfield1 setAutocorrectionType:UITextAutocorrectionTypeNo];
[self.view addSubview:textfield1];
textfield2 = [[UITextField alloc] initWithFrame:CGRectMake(20, 124, 164, 31)];
[textfield2 setDelegate:self];
[textfield2 setAutocorrectionType:UITextAutocorrectionTypeNo];
[self.view addSubview:textfield2]
textfield3 = [[UITextField alloc] initWithFrame:CGRectMake(20, 198, 164, 31)];
[textfield3 setDelegate:self];
[textfield3 setAutocorrectionType:UITextAutocorrectionTypeNo];
[self.view addSubview:textfield3];
[super viewDidLoad];
}
我还在后台放了一个按钮,触摸事件触发事件
-(IBAction)hideKeyboard:(id)sender{
[textfield1 resignFirstResponder];
[textfield2 resignFirstResponder];
[textfield3 resignFirstResponder];
}
这很好,没有错误。但是对于这个
-(BOOL)textFieldShouldReturn:(UITextField *)textField{
[self hideKeyboard:nil];
return YES;
}
我在main.m中获得了EXC_BAD_ACCESS。我已经被困在这几天了,不知道为什么会这样。
答案 0 :(得分:2)
我在iphone上测试了这个,没有错误。我认为这与模拟器本身有关。我发现如果我对[testField resignFirstResponder]
进行延迟,模拟器中不会抛出任何错误
答案 1 :(得分:1)
对于任何EXC_BAD_ACCESS错误,您通常会尝试向已发布的对象发送消息。追踪这些内容的最佳方式是使用NSZombieEnabled。
这可以通过永远不会实际释放一个对象,但将其包装为“僵尸”并在其中设置一个标志,表示它通常会被释放。这样,如果您再次尝试访问它,它仍然知道在发生错误之前它是什么,并且通过这些信息,您通常可以回溯以查看问题所在。
当调试器有时会抓取任何有用的信息时,它特别有助于后台线程。
非常重要但是,您需要100%确保这只是在您的调试代码而不是您的分发代码中。因为什么都没有发布,你的应用程序将泄漏,泄漏和泄漏。为了提醒我这样做,我把这个日志放在我的appdelegate:
if (getenv("NSZombieEnabled"))
NSLog(@"NSZombieEnabled enabled!");
如果您需要帮助查找确切的行,请执行构建和调试( CMD-Y )而不是构建并运行( CMD-R )。当应用程序崩溃时,调试器会向您显示确切的行,并与NSZombieEnabled结合使用,您应该能够确切地找到原因。
答案 2 :(得分:1)
将textFieldShouldReturn的返回值更改为NO。
当我在显示视图控制器时,即使没有resignFirstResponder调用,我也遇到了这个问题。
答案 3 :(得分:0)
您应该将hideKeyboard
方法重写为:
- (IBAction)hideKeyboard:(id)sender; {
if ([textfield1 isFirstResponder]) {
[textfield1 resignFirstResponder];
}
if ([textfield2 isFirstResponder]) {
[textfield2 resignFirstResponder];
}
if ([textfield3 isFirstResponder]) {
[textfield3 resignFirstResponder];
}
}
另外,请确保所有插座都正确连接在笔尖中,并确保文件为UITextFieldDelegate
,并且文本字段应将其委托连接到笔尖中的文件所有者。这应该(希望)解决问题。
编辑: 您应该尝试将3 UITextFields
放入笔尖,然后将其挂起。它通常会导致更少的问题,如果需要,以后更容易更改设计。
希望有所帮助!