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

未触发自定义后退按钮选择器

  •  1
  • nico9T  · 技术社区  · 12 年前

    我有两个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方法。有什么提示吗?

    谢谢

    尼古拉

    4 回复  |  直到 12 年前
        1
  •  1
  •   Sharanya K M    12 年前

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

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

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

    把这个放在你想从vcA推送vcB的地方。

    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中,您可以制作一个barbutton项目

     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
  •  1
  •   Community CDub    7 年前

    使用William Jockusch给出的技巧 Setting action for Back Button

    此外,根据 Updating the Navigation Bar

    • 如果新的顶层视图控制器具有自定义的左栏按钮项目,则会显示该项目。指定 自定义左侧栏 按钮项,设置 左栏按钮项目 视图控制器导航项的属性。
    • 如果顶级视图控制器没有自定义的左栏按钮项,但上一个视图控制器的导航项的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属性中的值来创建 适当的后退按钮。如果要指定自定义图像或 返回按钮的标题,可以指定自定义条形按钮项目 (使用您的自定义标题或图像)改为此属性。什么时候 配置您的条形按钮项目,不要为其分配自定义视图; 导航项目 忽略 后栏按钮中的自定义视图 无论如何

    这里提到的是 如果要为后退按钮指定自定义图像或标题,可以指定自定义栏按钮项目(带有自定义标题或图像) 但它忽略了自定义视图。所以您的选择器没有调用。

        3
  •  0
  •   Yashesh    12 年前

    你做错了。第一次推送到vcB和vcB中 查看DidLoad 方法放入此代码。

    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");
    }
    
        4
  •  0
  •   Guo Luchuan    12 年前

    您不能修改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");
    }