Клавиатура закрывается после открытия нескольких UIAlertViews - PullRequest
1 голос
/ 28 сентября 2011

У меня странная проблема с автоматическим закрытием и повторным открытием клавиатуры при открытии нескольких UIAlertView.Если у меня есть клавиатура (из отдельного UITextField), и я отображаю UIAlertView, то при отклонении этого предупреждения я открываю другое (открывая второе в didDismissWithButtonIndex).Когда я увольняю 2-го, он отклоняет клавиатуру, которая затем возвращается.Если я попытаюсь сделать это с более чем двумя предупреждениями подряд, он все равно закроет мою клавиатуру после того, как второе предупреждение будет отклонено, но не будет отображаться до тех пор, пока последнее предупреждение не будет отклонено.Проблема в том, что функции делегата клавиатуры НЕ вызываются, поэтому я не могу ответить на отклонение.У меня есть другие элементы пользовательского интерфейса (текстовое поле и изображения), которые сдвигаются при открытии клавиатуры, поэтому, когда она закрывается, эти элементы плавают на экране и выглядят странно.Есть идеи, почему эта клавиатура автоматически отключается?Спасибо

Кстати, я использую NSMutableArray объектов NSDictionary для постановки в очередь предупреждений, которые должны отображаться, если предупреждение уже отображается.Я не создаю и не отображаю более 1 предупреждения за раз.

РЕДАКТИРОВАТЬ: Вот пример кода.Если вы запустите это, вы увидите, что оба оповещения открыты (0, затем 1), после того как вы отклоните «1», вы увидите «0» под ним.После того, как вы отклоните '0', вы поймете, что я имею в виду - они на короткое время закрываются и открываются, но функции делегата не вызываются.Если вы установите значение i больше 2, вы увидите, что клавиатура все еще закрывается после отмены 2-го предупреждения, но будет оставаться закрытой до тех пор, пока не будет отменено последнее предупреждение.Я также попытался открыть только 1 UIAlert, и открывать другие по очереди из очереди, так как каждый был отклонен, и все еще заметил то же самое поведение.Есть идеи?

РЕДАКТИРОВАТЬ: После еще нескольких копаний я обнаружил, что если я регистрируюсь для уведомлений UIKeyboardDidShowNotification и UIKeyboardDidHideNotification, они фактически запускаются, когда клавиатура автоматически отклоняется и представляется.Я все еще хотел бы знать, что в базовом API вызывает его, чтобы его можно было избежать.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
// Override point for customization after application launch.
UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 100, 320, 48)];
[textField setDelegate:self];
[textField setBackgroundColor:[UIColor redColor]];
[window addSubview:textField];
[textField release];
[self.window makeKeyAndVisible];
return YES;
}

- (BOOL)textFieldShouldReturn:(UITextField *) textField{
NSLog(@"textFieldShouldReturn called with %@", textField);
[textField resignFirstResponder];
return YES;
}


-(void) textFieldDidBeginEditing:(UITextField *)textField 
{
NSLog(@"textFieldDidBeginEditing called with %@", textField);
for (int i=0; i< 2; i++) {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"test" message: [NSString stringWithFormat:@"%d", i] delegate:self cancelButtonTitle:NSLocalizedString(@"OK",@"") otherButtonTitles:nil];
    [alert show];
    [alert release];
}
}

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
{
NSLog(@"++++ textFieldShouldEndEditing %@", textField);
return YES;
}

-(void) textFieldDidEndEditing:(UITextField *)textField
{
NSLog(@"++++ textFieldDidEndEditing %@", textField);

}

1 Ответ

4 голосов
/ 29 сентября 2011

клавиатура отображается только в том случае, если соответствующий элемент пользовательского интерфейса является первым респондентом. Как-то несколько просмотров предупреждений изменяют цепочку респондента на короткое время.Похоже на проблему с каркасомОкно иерархии приложения.UIAlertViews создают свое собственное окно (на уровне окна UIWindowLevelAlert), делают его ключевым окном для получения сенсорного ввода, а затем снова закрывают окно старого окна.Когда вы показываете новое представление предупреждений на didDismiss, UIKit, кажется, теряет (временно) отслеживание ключевых окон и цепочки респондента.Вышеуказанное исправление, конечно, по-прежнему применимо.

...