当按下UINavigationController上的后退按钮时,如何调用方法?(iPhone)

当按下UINavigationController上的后退按钮时,如何调用方法?(iPhone),iphone,ipad,uinavigationcontroller,Iphone,Ipad,Uinavigationcontroller,按下UINavigationController上的后退按钮时,如何调用方法。在显示上一个视图之前,我需要能够调用一个方法。这可能吗?如果是这样的话,请有人建议如何执行此操作?最简单的方法是,将代码放入ViewController中,按下“后退”按钮时将显示该代码。您可以使用viewwillbeen - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; //Your code here

按下
UINavigationController
上的后退按钮时,如何调用方法。在显示上一个视图之前,我需要能够调用一个方法。这可能吗?如果是这样的话,请有人建议如何执行此操作?

最简单的方法是,将代码放入ViewController中,按下“后退”按钮时将显示该代码。您可以使用
viewwillbeen

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
     //Your code here
}
请注意,由于任何其他原因显示视图时,也会执行此操作,因此,如果您希望仅在按下“后退”按钮时执行此操作,则必须使用代理:
一个快速解决方案是为viewwilldiscover:方法添加一个实现。当按下后退按钮后,视图控制器将消失时,它将立即触发

- (void)viewWillDisappear:(BOOL)animated {
  //... 
  //make you stuff here
  //... 
}
另一个解决方案是向后退按钮添加自定义响应程序。您可以修改viewController的init方法,如下所示:

- (id)init {
    if (self = [super init]) {
        //other your stuff goes here
        //... 
        //here we customize the target and action for the backBarButtonItem
        //every navigationController has one of this item automatically configured to pop back
        self.navigationItem.backBarButtonItem.target = self;
        self.navigationItem.backBarButtonItem.action = @selector(backButtonDidPressed:);
    }
    return self;
}
然后可以使用选择器方法,如下所示。请确保正确关闭viewController,否则导航控制器将无法按需要弹出

- (void)backButtonDidPressed:(id)aResponder {
    //do your stuff
    //but don't forget to dismiss the viewcontroller
    [self.navigationController popViewControllerAnimated:TRUE];
}
创建一个自定义后退按钮,并使用该选择器调用所需的方法。并使用[self.navigationController popViewControllerAnimated:TRUE]

- (void)tappedBackButton:(id)button
{
    // call your method here
    [self.navigationController popViewControllerAnimated:TRUE];
} 
我想我找到了一个“干净”的方法:

首先,将视图控制器设置为符合UINavigationControllerDelegate协议

@interface MyViewController () <UINavigationControllerDelegate>
最后,使用UINavigationControllerDelegate协议中的此方法:

#pragma mark - Navigation controller delegate
- (void)willMoveToParentViewController:(UIViewController *)parent
{
    // If there is no parent, then it means that the view controller has been removed from the stack, which happens when the back button has been pressed
    if (!parent) {
        NSLog(@"Back button pressed");

        // it can be useful to store this into a BOOL property
        self.backButtonPressed = YES;
    }
}

当vc出现时,将调用该方法,而不一定只是返回到it@Colin这是正确的,这取决于他想要的确切行为,他可以使用委托,如果他只想在按下后退按钮时使用它。两者之间的一个区别是第一种解决方案(即
视图将消失
)在通过导航堆栈返回或前进时调用。第二种解决方案仅用于返回。这通常不起作用,因为您会发现BackbarButtonim为零,除非您显式为其指定按钮。无论如何,根据我的经验,LeftBarButtonim和BackbarButtonim都为零。@Matt是对的。在调用任何转发到另一个屏幕的按钮目标视图控制器如何知道它将到达堆栈的顶部?我希望它根据按下/弹出的ViewController.self.navigationItem.BackBarButtonim引用应用的更改进行更新。请注意,以这种方式替换“后退”按钮时,会丢失“从左边缘滑动以返回到父视图控制器”功能,这是iOS 7中引入的,是iPhone 6和6+上的一个有用的快捷方式。这不适用于self.navigationItem.RightBarButtonim…请给出另一个解决方案
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    // Set this View Controller as the navigation controller delegate
    self.navigationController.delegate = self;

}
#pragma mark - Navigation controller delegate
- (void)willMoveToParentViewController:(UIViewController *)parent
{
    // If there is no parent, then it means that the view controller has been removed from the stack, which happens when the back button has been pressed
    if (!parent) {
        NSLog(@"Back button pressed");

        // it can be useful to store this into a BOOL property
        self.backButtonPressed = YES;
    }
}