我有两个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方法。任何提示?
由于
尼古拉
答案 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");
}