调用错误处理程序后冻结屏幕

时间:2018-03-21 20:21:24

标签: ios uialertview frozen

我们在应用中处理信用卡交易。每当交易被拒绝或任何错误,我们将返回上一屏幕,我们要求客户使用另一张信用卡。

PaymentController.m

    [sharedVtp processSaleRequest:saleRequest
                completionHandler:^(VTPSaleResponse* response)
     {
         [self saleRequestComplete:response];
     }
      errorHandler:^(NSError* error)
     {

dispatch_async(dispatch_get_main_queue(), ^{
            UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Your transaction is declined" message:@"Please use another card and proceed" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
            [alert show];
            [self.navigationController popViewControllerAnimated:YES];
 });

     }];

控件返回上一屏幕,但屏幕冻结。我们无法点击该屏幕上的任何按钮。

2 个答案:

答案 0 :(得分:2)

正如其他人所说,UIAlertView hella 已弃用,您应该使用UIAlertController。此外,如上所述,您无法显示警报,然后在显示警报时弹出视图。

以下是如何修复它(替换主队列块中的内容):

UIAlertController *alert = [UIAlertController alertControllerWithTitle: @"Your transaction is declined"
                           message:@"Please use another card and proceed"
                           preferredStyle: UIAlertControllerStyleAlert];

[alert addAction: [UIAlertAction actionWithTitle: @"OK" style: UIAlertActionStyleDefault handler: ^(UIAlertAction *action) {
    [self.navigationController popViewControllerAnimated:YES];
}]];

[self presentViewController: alert animated: YES completion: nil];

请注意,现在只在UIAlertController的动作处理程序中调用pop调用,这意味着只有在用户按下OK按钮后才会调用

根据您要执行的操作,您还可以使用类似Toast的样式UIAlertController,不添加任何UIAlertAction,而是在警报控制器上调用dismiss它出现几秒后(在presentViewController通话的完成块中,使用调用后的调度)。

答案 1 :(得分:0)

您正在显示提醒。提醒是模态的;当警报存在时,用户不能点击除警报之外的任何其他内容。所以只需显示提醒并停止。用户现在必须与警报进行交互。在用户解除警报之前,请勿尝试执行任何其他操作。 然后你可以在其他地方导航。

停止使用UIAlertView。你应该使用UIAlertController。