Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 打开多个UIAlertView后键盘将关闭_Iphone_Keyboard_Uitextfield_Dismiss - Fatal编程技术网

Iphone 打开多个UIAlertView后键盘将关闭

Iphone 打开多个UIAlertView后键盘将关闭,iphone,keyboard,uitextfield,dismiss,Iphone,Keyboard,Uitextfield,Dismiss,我遇到了一个奇怪的问题,当我打开多个视图时,键盘会自动关闭然后重新打开。如果我有一个键盘(来自一个单独的UIExtField),并且我显示一个UIAlertView,那么在解除该警报后,我会打开另一个(打开didDismissWithButtonIndex中的第二个)。当我关闭第二个键盘时,它会关闭键盘,然后键盘会重新启动。如果我在连续两个以上警报的情况下尝试此操作,则在第二个警报解除后,它仍将关闭键盘,但直到最后一个警报解除后,它才会显示。问题是键盘委托函数没有被调用,因此我无法响应它被取消。

我遇到了一个奇怪的问题,当我打开多个视图时,键盘会自动关闭然后重新打开。如果我有一个键盘(来自一个单独的UIExtField),并且我显示一个UIAlertView,那么在解除该警报后,我会打开另一个(打开didDismissWithButtonIndex中的第二个)。当我关闭第二个键盘时,它会关闭键盘,然后键盘会重新启动。如果我在连续两个以上警报的情况下尝试此操作,则在第二个警报解除后,它仍将关闭键盘,但直到最后一个警报解除后,它才会显示。问题是键盘委托函数没有被调用,因此我无法响应它被取消。我还有其他UI元素(文本字段和图像),它们在键盘打开时会移动,所以当键盘关闭时,这些元素会浮在屏幕上,看起来很奇怪。你知道为什么键盘会自动关闭吗?谢谢

顺便说一句,我使用NSDictionary对象的NSMutableArray将需要显示的警报(如果已显示警报)排队。我一次不会创建和显示超过1个警报

编辑:下面是示例代码。如果运行此操作,您将看到两个警报都打开(0然后是1),在您关闭“1”后,您将在其下方看到“0”。在您关闭“0”后,您将了解我的意思-键盘会短暂关闭和打开,但不会调用任何委托函数。如果将i设置为大于2的值,您将看到键盘在解除第二个警报后仍然关闭,但将保持关闭状态,直到解除最后一个警报。我还试着只打开一个UIAlert,当每个UIAlert都被取消时,从队列中一次打开另一个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);

}
-(BOOL)应用程序:(UIApplication*)应用程序使用选项完成启动:(NSDictionary*)启动选项{
//应用程序启动后自定义的覆盖点。
UITextField*textField=[[UITextField alloc]initWithFrame:CGRectMake(0,100320,48)];
[textField setDelegate:self];
[textField setBackgroundColor:[UIColor redColor]];
[窗口添加子视图:文本字段];
[文本字段发布];
[self.window makeKeyAndVisible];
返回YES;
}
-(BOOL)textField应返回:(UITextField*)textField{
NSLog(@“textFieldShouldReturn调用%@”,textField);
[textField resignFirstResponder];
返回YES;
}
-(无效)textFieldDidBeginEditing:(UITextField*)textField
{
NSLog(@“textfielddebeginediting”调用%@,textField);
对于(int i=0;i<2;i++){
UIAlertView*alert=[[UIAlertView alloc]initWithTitle:@“测试”消息:[NSString stringWithFormat:@“%d”,i]委托:自取消按钮:NSLocalizedString(@“确定”,@“)其他按钮:nil];
[警报显示];
[警报发布];
}
}
-(BOOL)textField应取消编辑:(UITextField*)textField
{
NSLog(@“+++++textField应删除%@”,textField);
返回YES;
}
-(void)textfielddidediting:(UITextField*)textField
{
NSLog(@“+++++textfielddendediting%@”,textField);
}

只有当对应的UI元素是第一响应者时,才会显示键盘。。不知何故,多个警报视图会在短时间内修改响应者链。似乎是一个框架问题

我建议这样做:

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    dispatch_async(dispatch_get_main_queue(), ^{
        /* show new alert view here */
    });
}
编辑

实际上,我现在认为它与应用程序的窗口层次结构有关。UIAlertView创建自己的窗口(在窗口级别
UIWindowLevelAlert
),使其成为接收触摸输入的按键窗口,然后在退出时再次创建旧的窗口按键窗口。当您在DidDisclose上显示新警报视图时,UIKit似乎(暂时)失去了对关键窗口和响应程序链的跟踪。。

上述修复当然仍然适用。

只有当相应的UI元素是第一响应者时,才会显示键盘。。不知何故,多个警报视图会在短时间内修改响应者链。似乎是一个框架问题

我建议这样做:

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    dispatch_async(dispatch_get_main_queue(), ^{
        /* show new alert view here */
    });
}
编辑

实际上,我现在认为它与应用程序的窗口层次结构有关。UIAlertView创建自己的窗口(在窗口级别
UIWindowLevelAlert
),使其成为接收触摸输入的按键窗口,然后在退出时再次创建旧的窗口按键窗口。当您在DidDisclose上显示新警报视图时,UIKit似乎(暂时)失去了对关键窗口和响应程序链的跟踪。。

上述修复当然仍然适用。

如果您也提供了代码,那就太好了……如果您也提供了代码,那就太好了……太棒了!我想我永远也想不到这一点:)谢谢马丁!太神了我想我永远也想不到这一点:)谢谢马丁!