我有一个奇怪的问题,当我打开多个UIAlertView时,我的键盘自动关闭然后重新打开。如果我有一个键盘(来自一个单独的UITextField)并且我显示一个UIAlertView,那么在解除该警报后我打开另一个(在didDismissWithButtonIndex中打开第二个)。当我解雇第二个时,它会解锁键盘然后再回来。如果我连续超过2个警报尝试此操作,它将在第二个警报被解除后仍然关闭我的键盘,但在最后一个警报被解除之前它不会显示。问题是键盘委托函数没有被调用,所以我不能回应它被解雇。我有其他UI元素(文本字段和图像)在键盘打开时移动,所以当它关闭时,这些元素浮动在屏幕上,看起来很奇怪。知道为什么键盘自动解散?感谢
顺便说一句,我使用NSMictionaryArray的NSDictionary对象来排队在已经显示警报时需要显示的警报。我不是一次创建和显示超过1个警报。
编辑:这是示例代码。如果你运行它,你会看到两个警报打开(0然后1)你解雇'1'后你会看到'0'。解雇'0'后你会看到我的意思 - 他们的键盘会短暂关闭并打开,但不会调用任何委托函数。如果您将i设置为高于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);
}
答案 0 :(得分:4)
仅当相应的UI元素是第一响应者时才显示键盘。不知何故,多个警报视图在短时间内修改响应者链。看起来像一个框架问题..
我建议这个解决方法:
- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
dispatch_async(dispatch_get_main_queue(), ^{
/* show new alert view here */
});
}
修改强>
实际上我现在认为它与应用程序的Window层次结构有关。 UIAlertViews创建自己的窗口(在窗口级别UIWindowLevelAlert
),使它们成为接收触摸输入的关键窗口,然后在解雇时再次创建旧窗口键窗口。当您在didDismiss上显示新的警报视图时,UIKit似乎丢失(暂时)跟踪关键窗口和响应者链。
当然上面的修正仍然适用。