如果按下UINavigationController
上的后退按钮,我该如何调用方法?我需要能够在显示上一个视图之前调用方法。这可能吗?如果是这样,请有人建议如何做到这一点?
答案 0 :(得分:15)
快速解决方案是为 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];
}
答案 1 :(得分:6)
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];
创建自定义后退按钮并使用该选择器调用所需的方法。并且还使用[self.navigationController popViewControllerAnimated:TRUE];
- (void)tappedBackButton:(id)button
{
// call your method here
[self.navigationController popViewControllerAnimated:TRUE];
}
答案 2 :(得分:6)
我认为我找到了一种“干净”的方法:
首先,将视图控制器设置为符合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;
}
}
答案 3 :(得分:1)
最简单的方法是将代码放在按下后退按钮时显示的ViewController中。您可以使用viewWillAppear
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
//Your code here
}
请注意,当出于任何其他原因显示视图时,也会执行此操作,因此,如果您希望仅在按下后退按钮时才会执行此操作,则必须使用委托: UINavigationControllerDelegate