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

Hel*_*len 34 uialertview ipad ios ios8.3

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

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

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

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

我们知道UIAlertViewiOS 8已弃用.我们已开始迁移到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];
}
Run Code Online (Sandbox Code Playgroud)

小智 14

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

这里有一个快速解决方法UIAlertView:当文本字段或文本视图重新启动第一响应者时,延迟调用显示警报视图.

[self performSelector:@selector(showAlertView) withObject:nil afterDelay:0.6];
Run Code Online (Sandbox Code Playgroud)


Mik*_*e E 0

我也注意到了 textField 键盘和alertViews 的一些奇怪行为......也许创建一个名为disableKeyboard 的布尔值并像这样使用它:

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

    if (disableKeyBoard) {

        disableKeyboard = NO;
        return NO;

    } else {

        return YES;

    }

}

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

    disableKeyboard = YES;

}
Run Code Online (Sandbox Code Playgroud)

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