在TextField上使用resignFirstResponder时的EXC_错误访问应返回iphone

在TextField上使用resignFirstResponder时的EXC_错误访问应返回iphone,iphone,cocoa-touch,exc-bad-access,textfield,resignfirstresponder,Iphone,Cocoa Touch,Exc Bad Access,Textfield,Resignfirstresponder,当用户按下返回按钮时,我想隐藏一个文本字段。textfield是在interface builder中创建的,我在.h文件中添加了textfield委托,并将textfield的委托设置为文件所有者 @interface ProfileEdit : UIViewController<UITextFieldDelegate>{ UITextField *textfield1; UITextField *textfield2; UITextField *textf

当用户按下返回按钮时,我想隐藏一个文本字段。textfield是在interface builder中创建的,我在.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];
}
这很好,没有错误。但是为了这个

-(BOOL)textFieldShouldReturn:(UITextField *)textField{
    [self hideKeyboard:nil];
    return YES;
}

我在主楼的EXC\u访问权限不好。我已经在这个问题上纠缠了几天,不知道为什么会发生这种情况。

您应该将
隐藏板方法重新编写为:

- (IBAction)hideKeyboard:(id)sender; {
  if ([textfield1 isFirstResponder]) {
    [textfield1 resignFirstResponder];
  }
  if ([textfield2 isFirstResponder]) {
    [textfield2 resignFirstResponder];
  }
  if ([textfield3 isFirstResponder]) {
    [textfield3 resignFirstResponder];
  }
}
此外,确保所有插座都正确连接在nib中,并且您的文件是
UITextFieldDelegate
,并且文本字段应将其委托连接到nib中的文件所有者。这应该(希望)解决问题

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


希望有帮助

您应该将
hideKeyboard
方法重新写入:

- (IBAction)hideKeyboard:(id)sender; {
  if ([textfield1 isFirstResponder]) {
    [textfield1 resignFirstResponder];
  }
  if ([textfield2 isFirstResponder]) {
    [textfield2 resignFirstResponder];
  }
  if ([textfield3 isFirstResponder]) {
    [textfield3 resignFirstResponder];
  }
}
此外,确保所有插座都正确连接在nib中,并且您的文件是
UITextFieldDelegate
,并且文本字段应将其委托连接到nib中的文件所有者。这应该(希望)解决问题

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


希望有帮助

对于任何EXC\u BAD\u访问错误,您通常会尝试向已发布的对象发送消息。追踪这些信息的最佳方法是使用

这样做的方法是,永远不会真正释放对象,而是将其包装为“僵尸”,并在其内部设置一个标志,表示该对象通常会被释放。这样,如果您再次尝试访问它,它仍然知道在您出错之前是什么,并且有了这一点信息,您通常可以回溯到问题所在

当调试器有时在任何有用的信息上出错时,它在后台线程中尤其有用

需要注意的一点非常重要但是,您需要100%确保这只出现在调试代码中,而不是发布代码中。因为从来没有发布过任何东西,所以你的应用程序会一个接一个地泄漏。为了提醒我这样做,我将此日志放在appdelegate中:

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

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

对于任何EXC\u BAD\u访问错误,您通常试图向发布的对象发送消息。追踪这些信息的最佳方法是使用

这样做的方法是,永远不会真正释放对象,而是将其包装为“僵尸”,并在其内部设置一个标志,表示该对象通常会被释放。这样,如果您再次尝试访问它,它仍然知道在您出错之前是什么,并且有了这一点信息,您通常可以回溯到问题所在

当调试器有时在任何有用的信息上出错时,它在后台线程中尤其有用

需要注意的一点非常重要但是,您需要100%确保这只出现在调试代码中,而不是发布代码中。因为从来没有发布过任何东西,所以你的应用程序会一个接一个地泄漏。为了提醒我这样做,我将此日志放在appdelegate中:

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

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

更改textfield的返回值应返回为否


当我显示视图控制器时,即使没有退出FirstResponder调用,我也会遇到这个问题。

更改TextField的返回值应返回到NO


当我显示视图控制器时,即使没有退出FirstResponder呼叫,我也遇到了这个问题。

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

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

,感谢您的快速回复。我尝试了你的解决方案并检查了学员,但仍然没有成功。if函数确实有效,所以我可以确认其中一个文本字段是第一个响应者。你能发布更多的代码吗?如果这样做,调试问题应该会更容易,但除此之外,它看起来很好。也许可以尝试删除设置自动更正类型的行,看看没有这些行是否有效?另外,您确定除了dealloc方法之外,您没有在任何地方释放文本字段吗?看起来应该可以正常工作。您发布的代码似乎没有任何问题。我建议启动一个新的基于视图的简单项目,并将UITextField相关代码放入新项目中,看看代码是否在那里工作。如果是这样,那么代码的其他部分就有问题。谢谢您的快速回复。我尝试了你的解决方案并检查了学员,但仍然没有成功。if函数确实有效,所以我可以确认其中一个文本字段是第一个响应者