自定义后退按钮选择器未触发

时间:2013-03-14 08:50:29

标签: ios uinavigationcontroller back-button

我有两个UIView控制器,让我们在UINavigationController中将它们称为vcA和vcB。

我希望vcB有一个触发一些代码的自定义后退按钮,目标是做一些自定义动画

在vcA中我把这段代码:

UIViewController *vcB = [UIViewController alloc] init]

UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" 
                                                                      style:UIBarButtonItemStyleBordered 
                                                                     target:self 
                                                                     action:@selector(handleBack)];
self.navigationItem.backBarButtonItem = custombackBackButton;

[self.navigationController pushViewController: vcB animated: YES];

然后我在vcA和vcB中添加了这段代码:

-(void) handleBack
{
  NSlog(@"Going back to vcA");
}

永远不会调用handleback方法。任何提示?

由于

尼古拉

4 个答案:

答案 0 :(得分:1)

使用William Jockusch Setting action for Back Button

给出的技巧

并且根据Updating the Navigation Bar

  
      
  • 如果新的顶级视图控制器具有自定义左侧栏按钮项,则显示该项。要指定自定义左栏按钮项,请设置视图控制器导航项的 leftBarButtonItem 属性。
  •   
  • 如果顶级视图控制器没有自定义左栏按钮项,但前一个视图控制器的导航项在其backBarButtonItem属性中有一个有效项,则导航栏会显示该项。
  •   

所以如果你想拥有自定义选择器你需要在vcB NOT IN vbA

中写这个

vcB.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back"
                                                                         style:UIBarButtonItemStyleBordered
                                                                        target:self
                                                                        action:@selector(handleBack)];
    self.navigationItem.backBarButtonItem = customBackButton;
}

-(void) handleBack
{
  NSlog(@"Going back to vcA");
}

注意:

UINavigationController Class Reference

  

当此导航项位于该顶部项目的正下方时   堆栈,导航控制器派生后退按钮   此导航项的导航栏。当这个属性为零时,   导航项使用其title属性中的值来创建   适当的后退按钮。如果要指定自定义图像或   后退按钮的标题,您可以指定自定义栏按钮项   (使用您的自定义标题或图像)改为此属性。什么时候   配置栏按钮项,不要为其指定自定义视图;   后栏按钮中的导航项忽略自定义视图   反正。

这里提到如果要为后退按钮指定自定义图像或标题,可以指定自定义栏按钮项(带有自定义标题或图像)但忽略自定义视图。所以你的选择器没有调用。

答案 1 :(得分:1)

别误会我的意思,但我认为你需要清楚UINavigationController的push pop。

导航控制器通过在控制器的视图堆栈上按下/弹出视图来管理视图。当您按下某个项目时,当前视图会向左滑动屏幕,新视图会从右侧滑过。当然,这些动画可以根据你的意愿改变。

我认为这完全是你需要的。

将此文件放在要从vcA推送vcB的vcA中。

UIViewController *vcB = [UIViewController alloc] init];

[self.navigationController pushViewController: vcB animated: NO];

[UIView transitionWithView:self.navigationController.view
       duration:0.8
       options:UIViewAnimationOptionTransitionFlipFromRight
       animations:nil
       completion:nil];

在vcB中,你可以制作一个barbuttonitem

 UIBarButtonItem *addButton = [[[UIBarButtonItem alloc] initWithTitle:@"BackToVcA"
                                                               style:UIBarButtonItemStyleBordered
                                                              target:self
                                                              action:@selector(addAction:)] autorelease];
self.navigationItem.rightBarButtonItem = addButton;

在addActionMethod中:您可以使用以下代码导航回所需的动画

- (void)addAction:(id)sender
{
     UIViewController *vcA = [UIViewController alloc] init];

     [[self retain] autorelease];

     [self.navigationController pushViewController: vcA animated: NO];

     [UIView transitionWithView:self.navigationController.view duration:0.8 options:UIViewAnimationOptionTransitionFlipFromLeft animations:nil completion:nil];

     [self.navigationController popViewControllerAnimated:NO];

}

答案 2 :(得分:0)

你做错了。首先推送到vcB并在vcB viewDidLoad 方法中输入此代码。

UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(handleBack)]; 
 self.navigationItem.backBarButtonItem = custombackBackButton;

并将其放入vcB:

-(void) handleBack{
 NSlog(@"Going back to vcA");
}

答案 3 :(得分:0)

你不能修改backBarButtonItems动作,它是做默认(后退)动作,你应该在leftBarButtonItems中做自定义事物

在你的vcBs类中添加:

- (void)viewWillAppear:(BOOL)animated
{
    UIBarButtonItem *customBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back"
                                                                         style:UIBarButtonItemStyleBordered
                                                                        target:self
                                                                        action:@selector(handleBack)];
    self.navigationItem.leftBarButtonItem = customBackButton;
}

- (void)handleBack
{
    NSLog(@"back");
}