UIAlertView在iOS 8.3 for iPad上被取消后弹出键盘

时间:2015-05-08 17:09:34

标签: ios ipad uialertview ios8.3

使用最新的iOS 8.3版本,我们的应用程序开始出现奇怪的行为。

完成文本字段编辑后,用户可以单击关闭按钮,显示UIAlertView。当用户在alertview中单击 discard 时,将取消警报视图和当前视图。但不知何故,键盘在视图消失后显示出来,这对用户来说非常烦人。

经过一些调试后,似乎键盘显示的是用户在关闭视图之前访问过的最后一个文本字段。在点击endEditing中的按钮之后,我尝试了UIAlertView在许多地方的当前视图的各种方式(在显示UIAlertView之前;我甚至将焦点设置为视图的另一个UI元素)。它没有解决问题。

但对于这个特殊问题,我不确定这是一个常见问题还是我们需要解决的问题。在iOS 8.3之前,一切都运行良好。

我们了解iOS 8已弃用UIAlertView。我们已开始迁移到UIAlertController。但如果有任何解决方法,我们很乐意听到。

这是一些代码段。

- (IBAction)closeTapped:(UIButton *)sender
{
    // try to resign first responder
    // [self.tfName resignFirstResponder];
    // [self.tfPosition resignFirstResponder];
    [self.view endEditing:YES];

    if(self.orderDetails.isOpen && self.orderItemChanged)
    {
        UIAlertView* saveAlert = [[UIAlertView alloc] initWithTitle:@"Unsaved Changes"
                                                            message:@"Your changes have not been saved. Discard changes?"
                                                           delegate:self
                                                  cancelButtonTitle:@"Cancel"
                                                  otherButtonTitles:@"Save", @"Discard", nil];
        [saveAlert show];
    }
    else
    {
        [self close];
    }
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    switch(buttonIndex)
    {
        case 1: // Save
        {
            [self save];
            break;
        }
        case 2: // Discard
        {
            [self close];
            break;
        }
    }
}

- (void)close
{   
    [self.delegate dismissEditOrderItemVC];
}

7 个答案:

答案 0 :(得分:14)

如果您的部署目标是iOS 8+,请尝试UIAlertController

这里是UIAlertView的快速修复:当文本字段或文本视图撤消第一响应者时,延迟调用显示警报视图。

[self performSelector:@selector(showAlertView) withObject:nil afterDelay:0.6];

答案 1 :(得分:3)

如果有人在努力解决这个问题,我希望这会有所帮助:

if (NSClassFromString(@"UIAlertController")) {
    UIAlertController* alert = ...
}
else {
    UIAlertView* alert = ...
}

答案 2 :(得分:2)

您需要更改ios 8.3的警报

首先将此视图放在您的视图中

#define IS_IOS8 [[UIDevice currentDevice].systemVersion floatValue] >= 8.0

然后

if (IS_IOS8) {

        UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"Unsaved Changes" message:@"Your changes have not been saved. Discard changes?" preferredStyle:UIAlertControllerStyleAlert];

        UIAlertAction *saveAction = [UIAlertAction
                                    actionWithTitle:@"Save"
                                    style:UIAlertActionStyleCancel
                                    handler:^(UIAlertAction *action)
                                    {
                                        [self save];
                                    }];

        UIAlertAction *cancelAction = [UIAlertAction
                                   actionWithTitle:@"Cancel"
                                   style:UIAlertActionStyleCancel
                                   handler:^(UIAlertAction *action)
                                   {
                                       [alertVC dismissViewControllerAnimated:YES completion:nil];
                                   }];


        UIAlertAction *discardAction = [UIAlertAction
                                   actionWithTitle:@"Discard"
                                   style:UIAlertActionStyleCancel
                                   handler:^(UIAlertAction *action)
                                   {
                                       [alertVC dismissViewControllerAnimated:YES completion:nil];
                                   }];



        [alertVC addAction:saveAction];
        [alertVC addAction:cancelAction];
        [alertVC addAction:discardAction];
        [self.view.window.rootViewController presentViewController:alertVC animated:YES completion:nil];

这会帮助你,因为它可以帮助我解决同样的问题。 以上代码兼容ios 7& 8

答案 3 :(得分:2)

我也是,在关闭UIAlertController后弹出一个键盘(光标位于最后使用的textView中),这是一个非常简单的修复:

在构建和展示UIAlertController之前,

使用[_activeTextView resignFirstResponder];键盘将重新出现。 使用[self.view endEditing:YES];键盘不会再出现。

我希望这会对你有所帮助。

答案 4 :(得分:1)

如果文本字段是第一个响应者,它将在警报解除时自动弹出键盘。确保第一响应者被正确解雇:

[textField resignFirstResponder]

请记住:在表格或滚动视图中,有时必须在屏幕上显示该字段才能正确关闭响应者。

如果没有第一响应者处于活动状态,则在取消警报时不应出现键盘。

对于这个问题中的特定情况,我建议设置一个委托方法来监听"完成"按钮并在委托回调中重新启动第一个响应者。

或者,在开始编辑时,您可以存储对当前活动文本字段的引用,然后存储在" clickedButtonAtIndex"如果活动文本字段仍处于活动状态,您可以将其重新签名。

答案 5 :(得分:1)

尝试使用以下代码。它适用于iOS 8及以下版本

if (IS_OS_8_OR_LATER) {
        UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:title message:msg preferredStyle:UIAlertControllerStyleAlert];

        UIAlertAction *cancelAction = [UIAlertAction
                                     actionWithTitle:@"OK"
                                     style:UIAlertActionStyleCancel
                                     handler:^(UIAlertAction *action)
                                     {

                                     }];
        [alertVC addAction:cancelAction];

        [[[[[UIApplication sharedApplication] windows] objectAtIndex:0] rootViewController] presentViewController:alertVC animated:YES completion:^{

        }];
    }
    else{
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:title message:msg delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
        [alert show];
    }

}

答案 6 :(得分:0)

我注意到textField键盘和alertViews也有一些奇怪的行为......也许做一个名为disableKeyboard的bool并像这样使用它:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {

    if (disableKeyBoard) {

        disableKeyboard = NO;
        return NO;

    } else {

        return YES;

    }

}

- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex {

    disableKeyboard = YES;

}

这只是一种解决方法,并没有解决核心问题,无论它是什么。要使此方法起作用,您需要在标题中设置alertView和textField委托方法。