EXC_BAD_ACCESS при использовании resignFirstResponder для textFieldShouldReturn для iphone - PullRequest
0 голосов
/ 21 августа 2011

У меня есть текстовое поле, которое я хочу скрыть, когда пользователь нажимает кнопку возврата.текстовое поле было создано в конструкторе интерфейса, я добавил делегат текстового поля в мой файл .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;
}

я получаю EXC_BAD_ACCESS в main.m.Я застрял на этом пару дней и понятия не имею, почему это происходит.

Ответы [ 4 ]

2 голосов
/ 26 августа 2011

Я проверил это на своем iphone, и ошибки не было.Я думаю, что это связано с самим симулятором.Я обнаружил, что если я поставлю задержку на [testField resignFirstResponder], в симуляторе не будет выдано никакой ошибки

1 голос
/ 21 августа 2011

Для любых ошибок EXC_BAD_ACCESS вы обычно пытаетесь отправить сообщение освобожденному объекту. ЛУЧШИЙ способ отследить это - использовать NSZombieEnabled .

Это работает, никогда не выпуская объект, а заключая его в «зомби» и устанавливая внутри него флаг, который говорит, что обычно он был бы выпущен. Таким образом, если вы попытаетесь снова получить к нему доступ, он все еще будет знать, что было до того, как вы допустили ошибку, и с помощью этой небольшой информации вы, как правило, можете вернуться назад, чтобы увидеть, в чем заключалась проблема.

Это особенно помогает в фоновых потоках, когда отладчик иногда выбрасывает любую полезную информацию.

ОЧЕНЬ ВАЖНО ЗАМЕЧАНИЕ однако, вам нужно на 100% убедиться, что это только в вашем отладочном коде, а не в коде дистрибутива. Поскольку ничего не выпущено, ваше приложение будет течь и течь и течь. Чтобы напомнить мне сделать это, я поместил этот журнал в моем appdelegate:

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

Если вам нужна помощь в поиске точной строки, выполните Build-and-Debug ( CMD-Y ) вместо Build-and-Run ( CMD-R ). Когда приложение падает, отладчик покажет вам, какая именно строка и в сочетании с NSZombieEnabled, вы сможете точно узнать, почему.

1 голос
/ 25 августа 2011

Измените возвращаемое значение textFieldShouldReturn на NO.

У меня была эта проблема даже без вызова resignFirstResponder, когда я отображал контроллер представления.

0 голосов
/ 21 августа 2011

Вы должны переписать метод hideKeyboard в:

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

Кроме того, убедитесь, что все выходы правильно подключены к пиру, и что ваш файл - UITextFieldDelegate, а у текстовых полей должен быть свой делегат, подключенный к владельцу файла в пате. Это должно (надеюсь) решить проблему.

РЕДАКТИРОВАТЬ: Вы должны попробовать положить 3 UITextFields в перо и подключить их таким образом. Это обычно приводит к меньшему количеству проблем, и легче изменить дизайн позже, если вам нужно.

Надеюсь, это поможет!

...