【问题标题】:UINavigationController and back button actionUINavigationController 和后退按钮操作
【发布时间】:2012-12-24 17:31:08
【问题描述】:

我有两个controllers,第一个是self,第二个是maincontroller,我在stack中推maincontroller,所以返回按钮会自动出现。

这里我需要在用户按下后退按钮时发出警报。

我该怎么做?

【问题讨论】:

    标签: ios objective-c uinavigationcontroller


    【解决方案1】:

    或者您可以使用UINavigationController 的委托方法。 willShowViewController方法在你VC的后退按钮被按下时被调用。

    - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated;
    

    【讨论】:

    • 也是我想要的。 :-) 作为记录,您需要在导航回的视图控制器上实现协议。
    • 这个解决方案效果很好,效率最高。确保与您的 navigationController 委托的连接在 -(void) viewDidAppear:(BOOL)animated 中,否则当第一个视图控制器第一次启动时也会出现警报。
    • @Morkrom 是的,每次在导航控制器中显示视图控制器时都会调用它,最好检查视图控制器参数以进行必要的更改。
    • 并使用 if([viewController isKindOfClass:[CustomViewController class]]){ ..code.. } 来指定应该在哪个视图控制器上显示消息
    • 每当视图消失时都会调用此方法,而不仅仅是按下后退按钮时。例如,如果您推送另一个视图(例如模态视图),也会调用此方法。
    【解决方案2】:

    首先使用隐藏后退按钮

    self.navigationItem.hidesBackButton = YES;
    

    然后创建自己的自定义按钮:

    UIBarButtonItem *backBtn =[[UIBarButtonItem alloc]initWithTitle:@"back" style:UIBarButtonItemStyleDone target:self action:@selector(popAlertAction:)];
    self.navigationItem.leftBarButtonItem=backBtn;
    [backBtn release];
    

    你的选择器在这里:

    - (void)popAlertAction:(UIBarButtonItem*)sender
    {
        //Do ur stuff for pop up
    }
    

    【讨论】:

    • K 伙计们谢谢,这是第二个选项,有没有办法检测 UINavigationController 的后退按钮操作..?
    • b 怎么样?请修复它。
    • @HarishSaran 你是什么意思?单击警报视图时是否需要返回?
    • 很好的建议,这对我有用,因为我正在做一个自定义导航控制器并且无法将委托回调实现为正确答案。但是,我可以设置hidesBackButton = YES,因为这会在手动推送新的UINavigationItem 时导致一些视觉伪影。
    • 注意,在使用自定义后退按钮呈现视图控制器之前,您需要在父视图控制器上放置“self.navigationItem.hidesBackButton = YES”。
    【解决方案3】:

    最好最简单的方法

    尝试将其放入要检测压力的视图控制器中:

    -(void) viewWillDisappear:(BOOL)animated {
        if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) {
           // back button was pressed.  We know this is true because self is no longer
           // in the navigation stack.  
        }
        [super viewWillDisappear:animated];
    }
    

    【讨论】:

      【解决方案4】:

      创建自己的UIBarButtonItem,并将其设置为mainControllerviewDidLoad方法中的leftBarButtonItem

      例如(这里我使用了一个系统项,但您也可以创建一个不同的,请参阅类参考了解详细信息)。

      UIBarButtonItem *leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(showAlertView:)];
      self.navigationItem.leftBarButtonItem = leftBarButtonItem;
      
      // only if you don't use ARC
      // [leftBarButtonItem release];
      

      在哪里

      - (void)showAlertView:(id)sender
      {
          // alert view here...
      }
      

      【讨论】:

        【解决方案5】:

        添加带有操作的自定义后退按钮并在该操作方法中设置警报。您可以从此处添加自定义后退按钮:http://www.applausible.com/blog/?p=401

        【讨论】:

          【解决方案6】:

          viewControllerCount - 是保存先前在 UINavigationController 中的 viewController 数量的 var。然后,我们检查 viewControllerCount > [viewControllers count] 如果是,我们知道我们会返回(即后退按钮模仿)。

          - (void)navigationController:(UINavigationController *)navigationController
                willShowViewController:(UIViewController *)viewController
                              animated:(BOOL)animated
          {
              NSArray *viewControllers = [navigationController viewControllers];
          
              if (viewControllerCount > [viewControllers count])
              {
                  // your code
              }
          
              viewControllerCount = [viewControllers count];
          }
          

          【讨论】:

            【解决方案7】:

            创建一个按钮并给按钮操作如下。

            [self alert];
            

            当显示警报时,点击是后

            [self.navigationController popViewController];
            

            之后,

            self.navigationController.LeftBarButton = myButton;
            

            这可能会有所帮助

            【讨论】:

            • 警报有什么用?
            • @richy 感谢您对这么老的答案发表评论。警报用于显示问题中询问的警报。
            猜你喜欢
            • 1970-01-01
            • 2015-02-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多