iphone上使用resignFirstResponder时的EXC_BAD_ACCESS用于iPhone的textFieldShouldReturn

时间:2011-08-21 19:48:30

标签: iphone cocoa-touch exc-bad-access textfield resignfirstresponder

我有一个文本字段,我想在用户按下返回按钮时隐藏。 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。我已经被困在这几天了,不知道为什么会这样。

4 个答案:

答案 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放入笔尖,然后将其挂起。它通常会导致更少的问题,如果需要,以后更容易更改设计。

希望有所帮助!