在iOS中按下后退按钮时如何创建确认弹出窗口?

Posted

技术标签:

【中文标题】在iOS中按下后退按钮时如何创建确认弹出窗口?【英文标题】:How to create a confirmation Pop Up when pushing Back button in iOS? 【发布时间】:2014-01-09 18:50:32 【问题描述】:

我想在有人按下我的 ios 应用程序的“返回”按钮时添加一个弹出窗口,询问用户是否真的想回来。然后,根据用户的响应,我想撤消操作或继续。我尝试在视图的 viewWillDisappear 函数中添加代码,然后编写正确的委托,但它不起作用,因为它总是更改视图然后显示弹出窗口。我的代码是:

    -(void) viewWillDisappear:(BOOL)animated 
       _animated = animated;
       if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) 
           UIAlertView *alert_undo = [[UIAlertView alloc] initWithTitle:@"UIAlertView"
                                                                message:@"You could be    loosing information with this action. Do you want to proceed?"
                                                               delegate:self
                                                      cancelButtonTitle:@"Go back"
                                                      otherButtonTitles:@"Yes", nil];
           [alert_undo show];
       
       else [super viewWillDisappear:animated];
   

委托实现是:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

    NSString *title = [alertView buttonTitleAtIndex:buttonIndex];
    if([title isEqualToString:@"Yes"])
    
        [super viewWillDisappear:_animated];
    

这根本不起作用。现在有没有人有更好的方法来做到这一点或可能出了什么问题?

非常感谢,

【问题讨论】:

【参考方案1】:

一旦调用 -viewWillDisappear:,就无法阻止您的 viewController 消失。

理想情况下,您应该覆盖navigationBar 的后退按钮,并在其方法中显示警报(其余部分几乎相同

- (void)viewDidLoad

    //...
    UIBarButtonItem *bbtnBack = [[UIBarButtonItem alloc] initWithTitle:@"Back"
                                                                 style:UIBarButtonItemStyleBordered
                                                                target:self
                                                                action:@selector(goBack:)];

    [self.navigationItem setBackBarButtonItem: bbtnBack];


- (void)goBack:(UIBarButtonItem *)sender

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert"
                                                    message:@"...Do you want to proceed?"
                                                   delegate:self
                                          cancelButtonTitle:@"No"
                                          otherButtonTitles:@"Yes", nil];
    [alert show];


- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

    switch(buttonIndex) 
        case 0: //"No" pressed
            //do something?
            break;
        case 1: //"Yes" pressed
            //here you pop the viewController
            [self.navigationController popViewControllerAnimated:YES];
            break;
    

注意:不要忘记在这个viewController.h文件中声明<UIAlertViewDelegate> em>

【讨论】:

@recasens :不客气。将您的答案标记为已接受,我也会赞成 :) 无论如何,从技术上讲...[self.navigationItem setLeftBarButtonItem:bbtnBack];[self.navigationItem setBackBarButtonItem: bbtnBack]; 都应该有效(在您的情况下【参考方案2】:

感谢您的回答,@staticVoidMan!我终于用你的代码做了一些修改。后退按钮无法修改,因此应创建一个附加按钮并隐藏标准按钮。唯一的问题是新的“返回”按钮的样式,它不等于标准的。最终代码为:

- (void)viewDidLoad


    self.navigationItem.hidesBackButton = YES;
    UIBarButtonItem *bbtnBack = [[UIBarButtonItem alloc] initWithTitle:@"Back"
                                                                 style:UIBarButtonItemStyleBordered
                                                                target:self
                                                                action:@selector(goBack:)];

    self.navigationItem.leftBarButtonItem = bbtnBack;



- (void)goBack:(UIBarButtonItem *)sender

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Alert"
                                                    message:@"...Do you want to proceed?"
                                                   delegate:self
                                          cancelButtonTitle:@"No"
                                          otherButtonTitles:@"Yes", nil];
    [alert show];


- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

    switch(buttonIndex) 
        case 0: //"No" pressed
            //do something?
            break;
        case 1: //"Yes" pressed
            //here you pop the viewController
            [self.navigationController popViewControllerAnimated:YES];
            break;
    

【讨论】:

@AlexSpencer 请避免编辑帖子以用您自己的想法改进代码。您可以添加评论以提出改进建议。请参阅此处的指南:***.com/help/editing @SysDragon 这是一个微妙的变化。但这不是我的意见。见此链接:***.com/questions/4649423/… @AlexSpencer 这是在谈论良好的编程实践,而不是在编辑其他内容。在此站点中,您应该编辑帖子以添加新代码以进行改进。您可以在评论中提出建议。 @AlexSpencer 阅读:meta.***.com/questions/265689/… @SysDragon 好吧,我不会编辑代码我会评论。话虽如此,这是我对上面代码的评论:在 switch case 语句中总是有一个default: break;

以上是关于在iOS中按下后退按钮时如何创建确认弹出窗口?的主要内容,如果未能解决你的问题,请参考以下文章

如何在离子的inAppBrowser内的后退按钮上添加确认弹出窗口

离子2:如何处理硬件后退按钮,检查应用程序中退出的确认

Unity3d怎么做到游戏中按下一个按钮,弹出窗口

按下大视图通知按钮后如何敬酒

当我按下下载按钮时如何显示带有 CircularProgressIndicator 和下载状态的弹出窗口

按下后退按钮时的自定义动画 - iOS