0

我有一个文本字段,当用户按下返回按钮时我想隐藏它。文本字段是在界面生成器中创建的,我在 .h 文件中添加了文本字段委托,并将文本字段的委托设置为文件所有者。

@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];
}

我还在后台放了一个按钮,触发 touchupinside 事件

-(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

4 回答 4

2

我在我的iphone上测试了这个,没有错误。我认为这与模拟器本身有关。我发现如果我延迟[testField resignFirstResponder],模拟器中不会抛出错误

于 2011-08-26T19:17:13.640 回答
1

对于任何 EXC_BAD_ACCESS 错误,您通常会尝试向已释放对象发送消息。追踪这些的最佳方法是使用NSZombieEnabled

这是通过从不实际释放对象来实现的,而是将其包装为“僵尸”并在其中设置一个标志,表明它通常会被释放。这样,如果您再次尝试访问它,它仍然会在您出错之前知道它是什么,并且通过这一点信息,您通常可以回溯以查看问题所在。

当调试器有时会发现任何有用的信息时,它尤其有助于后台线程。

但是非常重要的是,您需要 100% 确保这仅在您的调试代码中,而不是在您的分发代码中。因为什么都没有发布,所以你的应用程序会泄漏、泄漏和泄漏。为了提醒我这样做,我把这个日志放在我的 appdelegate 中:

if (getenv("NSZombieEnabled"))
  NSLog(@"NSZombieEnabled enabled!");

如果您需要帮助找到确切的行,请执行构建和调试 ( CMD-Y ) 而不是构建和运行 ( CMD-R )。当应用程序崩溃时,调试器将准确显示哪一行,并结合 NSZombieEnabled,您应该能够准确找出原因。

于 2011-08-21T19:56:37.193 回答
1

将 textFieldShouldReturn 的返回值更改为 NO。

在显示视图控制器时,即使没有 resignFirstResponder 调用,我也遇到了这个问题。

于 2011-08-25T11:02:59.680 回答
0

您应该将方法重写hideKeyboard为:

- (IBAction)hideKeyboard:(id)sender; {
  if ([textfield1 isFirstResponder]) {
    [textfield1 resignFirstResponder];
  }
  if ([textfield2 isFirstResponder]) {
    [textfield2 resignFirstResponder];
  }
  if ([textfield3 isFirstResponder]) {
    [textfield3 resignFirstResponder];
  }
}

此外,请确保所有出口都正确连接到笔尖,并且您的文件是 a UITextFieldDelegate,并且文本字段应该将它们的委托连接到笔尖中的文件所有者。那应该(希望)解决问题。

编辑:您应该尝试将 3UITextFields放入笔尖,然后以这种方式连接它们。它通常会导致更少的问题,并且如果您需要,以后更容易更改设计。

希望有帮助!

于 2011-08-21T19:53:03.137 回答