1

我有两个 UIViewcontroller,我们在 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

4 回答 4

1

使用 William Jockusch 给出的技巧为后退按钮设置操作

并且还根据更新导航栏

  • 如果新的顶级视图控制器有一个自定义的左栏按钮项,则显示该项。要指定自定义左栏按钮项,请设置视图控制器导航项的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 类参考

当此导航项位于堆栈顶部项的正下方时,导航控制器会从此导航项派生导航栏的后退按钮。当此属性为 nil 时,导航项使用其 title 属性中的值来创建适当的后退按钮。如果要为后退按钮指定自定义图像或标题,则可以将自定义栏按钮项(带有自定义标题或图像)分配给此属性。在配置你的 bar button item 时,不要为其分配自定义视图;导航项无论如何都会忽略后退栏按钮中的自定义视图。

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

于 2013-03-14T09:02:01.310 回答
1

不要误会我的意思,但我认为您需要清楚 UINavigationController 的推送弹出。

导航控制器通过将视图推入/弹出控制器的视图堆栈来管理视图。当您按下一个项目时,当前视图会滑出屏幕左侧,而新视图会从右侧滑出。当然,这些动画可以根据您的意愿进行更改。

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

把它放在你想从 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];

}
于 2013-03-14T10:04:08.137 回答
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");
}
于 2013-03-14T08:55:35.033 回答
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");
}
于 2013-03-14T09:08:36.060 回答