【问题标题】:iPhone - Change target or selector for Back Button on UINavigationControlleriPhone - 在 UINavigationController 上更改后退按钮的目标或选择器
【发布时间】:2010-12-03 21:25:42
【问题描述】:
在 UINavigationController 上推送 UIViewController 时的默认行为是让操作系统显示一个后退按钮,该按钮会再次弹出 UIViewController。
我希望为此后退按钮设置不同的行为(返回两个屏幕) - 无论如何我可以做到这一点,而无需使用自定义图形等创建自己的后退按钮。
谢谢:)
【问题讨论】:
标签:
iphone
uiviewcontroller
uinavigationcontroller
【解决方案1】:
正如我最初怀疑的那样,这不可能是任何非常简单的方法。因此,在创建任何自定义 UIBarButtonItem 时,同样的方法也适用,只需从 Google 获取后退按钮图标....
UIButton *backButtonInternal = [[UIButton alloc] initWithFrame:CGRectMake(0,0,54,30)];
[backButtonInternal setBackgroundImage:[UIImage imageNamed:@"backButton.png"] forState:UIControlStateNormal];
boldSystemFontOfSize:12]];
[backButtonInternal addTarget:self action:@selector(backButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *backBarButton = [[UIBarButtonItem alloc] initWithCustomView:backButtonInternal];
[backButtonInternal release];
[[self navigationItem] setLeftBarButtonItem:backBarButton];
[backBarButton release];
【解决方案2】:
使用“leftBarButtonItem”可以设置目标和选择器。但是如果你在前一个控制器上设置了“backBarButtonItem”,那么目标和选择器将被忽略。但是,leftBarButtonItem 没有向左箭头。
【解决方案3】:
UIViewController 的 navigationItem 属性有什么问题吗?以下是我获得取消按钮的方式,例如:
self.navigationItem.leftBarButtonItem =
[[[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemCancel
target: self
action: @selector(cancel)] autorelease];
【解决方案4】:
在父视图控制器中,
- (void)viewDidLoad
{
self.navigationController.delegate= self;
}
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if (viewController == self)
{
// your codes
}
}
【解决方案5】:
如果您将导航控制器子类化,您可以实现 popViewControllerAnimated: 方法,并在其中抛出 isKindOfClass: 检查以确定您正在寻找的视图控制器是否正在弹出。例如:
- (UIViewController *)popViewControllerAnimated:(BOOL)animated
{
//Reference current controller being displayed
UIViewController *currentController = [self.viewControllers lastObject];
//Check class
if ([currentController isKindOfClass:[MyDesiredController class]]) {
NSLog(@"Popping Desired Controller, Do Stuff Here");
}
return [super popViewControllerAnimated:animated];
}
但是这不会取消视图控制器的实际弹出(返回 nil 将停止控制器弹出但仍会导致导航栏弹出它的信息,并且向导航栏的 shouldPop: 委托方法返回 NO 将无论如何仍然弹出控制器。我听说这只发生在使用导航控制器时,但我没有测试过。
但是,对于您的情况,由于您希望将两个视图控制器弹回,您可以通过将视图控制器转换为 nsmutablearray、删除控制器,然后转换此 nsmutablearray 来从导航控制器的 viewcontrollers 属性中删除倒数第二个视图控制器返回一个数组并将其设置为导航控制器的 viewcontrollers 属性。我没有对此进行测试,但我想我会分享这个想法。