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



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

一个快速解决方案是为viewWillDisappear:方法添加一个实现。当viewController响应后退按钮按下而消失时,它就会被触发。

- (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];
}
UIButton *backButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 52, 31)];
[backButton setBackgroundImage:[UIImage imageNamed:@"BackButton.png"] forState:UIControlStateNormal];
//[backButton setTitle:@"CLOSE" forState:UIControlStateNormal];
[backButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
[backButton.titleLabel setFont:[UIFont boldSystemFontOfSize:14.0f]];
[backButton addTarget:self action:@selector(tappedBackButton:) forControlEvents:UIControlStateHighlighted];
UIBarButtonItem* item = [[UIBarButtonItem alloc] initWithCustomView:backButton];
self.navigationItem.leftBarButtonItem = item;
[item release];

创建一个自定义的Back Button,并使用该选择器调用所需的方法。也可以使用[self.navigationController popViewControllerAnimated:TRUE];

- (void)tappedBackButton:(id)button
{
    // call your method here
    [self.navigationController popViewControllerAnimated:TRUE];
} 

我想我找到了一种"干净"的方法:

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

@interface MyViewController () <UINavigationControllerDelegate>

然后,将其定义为代理

- (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;
}

最后,使用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;
    }
}

最简单的方法是将代码放在ViewController中,当按下后退按钮时会显示该代码。您可以使用viewWillAppear

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
     //Your code here
}

请注意,当视图因任何其他原因显示时,也会执行此操作,因此,如果希望仅在按下后退按钮时执行,则必须使用委托:UINavigationControllerDelegate

最新更新