iPhone - 在UINavigationController上更改Back Button的目标或选择器

时间:2009-10-05 09:31:32

标签: iphone uiviewcontroller uinavigationcontroller

在UINavigationController上按UIViewController时的默认行为是操作系统显示一个后退按钮,再次关闭UIViewController。

我希望为这个后退按钮设置一个不同的行为(返回两个屏幕) - 无论如何我可以做到这一点,而无需使用自定义图形等创建我自己的后退按钮。

谢谢:)

5 个答案:

答案 0 :(得分:4)

正如我原本怀疑的那样,这是不可能的任何特别简单的方法。因此,在创建任何自定义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];

答案 1 :(得分:2)

使用“leftBarButtonItem”可以设置目标和选择器。但是如果在前一个控制器上设置“backBarButtonItem”,则将忽略目标和选择器。但是,leftBarButtonItem没有左箭头。

答案 2 :(得分:0)

UIViewController的navigationItem属性有什么问题吗?以下是我获取取消按钮的方法,例如:

self.navigationItem.leftBarButtonItem =
  [[[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemCancel
                                               target: self
                                               action: @selector(cancel)] autorelease];  

答案 3 :(得分:0)

在父视图控制器中,

- (void)viewDidLoad
{    
    self.navigationController.delegate= self;
}

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    if (viewController == self)
    {
        // your codes
    }
}

答案 4 :(得分:0)

如果你是导航控制器的子类,你可以实现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将阻止控制器弹出但仍然会导致导航栏弹出它的信息,并返回NO到导航栏的shouldPop:delegate方法将无论如何仍然弹出控制器。我听说只有在使用导航控制器时才会出现这种情况,但我没有测试过这个。)

但是,对于您的情况,由于您希望重新弹出两个视图控制器,您可以通过将viewcontrollers转换为nsmutablearray,删除控制器,然后转换此nsmutablearray,从导航控制器的viewcontrollers属性中删除第二个最后一个视图控制器返回一个数组并将其设置为导航控制器的viewcontrollers属性。我没有测试过这个,但我想我会分享这个想法。