将dismissViewController 与UIAlertController 一起使用

Posted

技术标签:

【中文标题】将dismissViewController 与UIAlertController 一起使用【英文标题】:Using dismissViewController with UIAlertController 【发布时间】:2018-07-25 19:34:48 【问题描述】:

我正在更新 ios 中的 Objective-C 应用程序,由于 UIAlertView 已被弃用,因此我将 UIAlertController 与 UIAlertAction 一起用于 OK 和 Cancel 按钮。所以我对后退按钮有以下功能,但我不知道如何处理 OK 和 Cancel 按钮,因为 OK 应该让你回到上一个屏幕,而 Cancel 应该让你留在同一个屏幕上。以下是我到目前为止的代码。

- (void)backAction:(id)sender

    //do your saving and such here

    if ([doneBtn isEnabled])
    
        //CHANGE 2018
        UIAlertController *alert = [UIAlertController alertControllerWithTitle: @"Alert" message:@"Signature will be lost. Do you want to continue?." preferredStyle:UIAlertControllerStyleAlert];

        UIAlertAction *ok = [UIAlertAction actionWithTitle: @"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) 
            //should go to the previous scree. 
            //[alert dismissViewControllerAnimated:TRUE completion:nil]; //I'm not sure if this only hides the alert or hides the entire screen 

        ];
        UIAlertAction *cancel = [UIAlertAction actionWithTitle: @"Cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) 
            //should stay in the same screen 
            [alert dismissViewControllerAnimated:TRUE completion:nil]; //the same doubt 

        ];

        [alert addAction: ok];
        [alert addAction: cancel];

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


        //UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"Alert" message:@"Signature will be lost. Do you want to continue?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok",nil];
        //[alert show];
    

【问题讨论】:

【参考方案1】:

[alert dismissViewControllerAnimated:TRUE completion:nil] 语句只会关闭警报,因为它是屏幕上的顶视图控制器。

因此,您无需为 Cancel 操作执行任何其他操作。

对于您的 Ok 操作,您有多个操作可以返回上一个屏幕:

如果您的视图控制器是 UIViewController 单独的,只需调用 [self dismissViewControllerAnimated:TRUE completion:nil]`

如果视图控制器嵌入到导航控制器中,请调用[self.navigationController popToRootViewControllerAnimated:YES]

你也可以使用 unwind segue 到你想要返回的视图控制器。

希望对你有帮助! ;)

【讨论】:

【参考方案2】:

无需致电[alert dismissViewControllerAnimated:TRUE completion:nil];,当您点击其中一个按钮时,警报将被解除。

在完成ok 按钮时,如果您的viewController 嵌入在navigationController 中,您可以使用[self.navigationController popToRootViewControllerAnimated:YES];

【讨论】:

【参考方案3】:

以上答案都是正确的。我其实很想发表评论,但我没有足够的声誉。

您应该尝试查看此线程以更好地了解解除 viewController。 Dismissing a Presented View Controller

【讨论】:

【参考方案4】:

试试这个,希望这能解决你的问题。

UIAlertController * alert=[UIAlertController alertControllerWithTitle:@"Title" 
message:@"Message"preferredStyle:UIAlertControllerStyleAlert];

UIAlertAction* okButton = [UIAlertAction
                    actionWithTitle:@"Ok, please"
                    style:UIAlertActionStyleDefault
                    handler:^(UIAlertAction * action)
                    
                        [self okButtonPressed];

                    ];
UIAlertAction* cancelButton = [UIAlertAction
                        actionWithTitle:@"No, thanks"
                       style:UIAlertActionStyleDefault
                       handler:^(UIAlertAction * action)
                       
                           [self cancelButtonPressed];

                       ];

[alert addAction:okButton];
[alert addAction:cancelButton];

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

现在关闭视图控制器。

- (void)cancelButtonPressed
 // Write your implementation for Cancel button here.


 - (void)okButtonPressed
//Write your implementation for Ok button here

【讨论】:

以上是关于将dismissViewController 与UIAlertController 一起使用的主要内容,如果未能解决你的问题,请参考以下文章

Dismissviewcontroller 并执行 segue

未调用dismissViewController 完成处理程序

dismissViewController 或 popViewController 都不起作用

为 DismissViewController 添加通知而不进行子类化

ios调用dismissViewController的一个小陷阱

DismissViewController UIButton 导致应用程序在 iPod touch 上崩溃