代码之家  ›  专栏  ›  技术社区  ›  adam

iPhone-在uinavigationcontroller上更改后退按钮的目标或选择器

  •  2
  • adam  · 技术社区  · 16 年前

    在uinavigationcontroller上推uiviewcontroller时,操作系统的默认行为是显示一个后退按钮,该按钮将再次弹出uiviewcontroller。

    我希望为这个后退按钮设置不同的行为(返回两个屏幕)-是否无论如何,我可以这样做,而不必创建我自己的后退按钮与自定义图形等。

    谢谢)

    5 回复  |  直到 12 年前
        1
  •  4
  •   adam    16 年前

    正如我最初怀疑的那样,这不可能有任何特别容易的方法。所以同样的方法也适用于创建任何自定义的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
  •  2
  •   gstroup    15 年前

    使用“leftbarbuttonitem”可以设置目标和选择器。但是,如果在上一个控制器上设置“backbarbuttonitem”,则目标和选择器将被忽略。但是,LeftBarButtonItem没有左指向箭头。

        3
  •  0
  •   jamie    15 年前

    uiviewController的navigationItem属性有什么问题吗?以下是如何获得取消按钮,例如:

    self.navigationItem.leftBarButtonItem =
      [[[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemCancel
                                                   target: self
                                                   action: @selector(cancel)] autorelease];  
    
        4
  •  0
  •   Andy Obusek    12 年前

    在父级的视图控制器中,

    - (void)viewDidLoad
    {    
        self.navigationController.delegate= self;
    }
    
    - (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
    {
        if (viewController == self)
        {
            // your codes
        }
    }
    
        5
  •  0
  •   Adam Eisfeld    12 年前

    如果您的导航控制器是子类的,那么您可以实现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转换回数组并将其设置为s导航控制器的ViewControllers属性。我还没有测试过这个,但我想我会分享这个想法。