【问题标题】:Adding UIBarButtonItem to all Navigation View Controllers inside a UITabBarController programmatically以编程方式将 UIBarButtonItem 添加到 UITabBarController 内的所有导航视图控制器
【发布时间】:2012-04-15 14:20:23
【问题描述】:

结构如下:

  • 查看
  • 标签栏控制器
    • 导航控制器
      • 视图控制器
    • 导航控制器
      • 视图控制器
    • 导航控制器
      • 视图控制器
    • 导航控制器
      • 视图控制器
    • 导航控制器
      • 视图控制器
    • 导航控制器
      • 视图控制器

以上控制器已在界面生成器中初始化。

我正在尝试为每个导航控制器添加一个右 UIBarButtonItem 但没有任何成功。

这是我尝试过的:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor clearColor];
    self.view.opaque = NO;
    self.tabBarController.view.frame = self.view.bounds;

    NSArray *currentViewControllers = self.tabBarController.viewControllers;
    NSMutableArray *updatedViewControllers = [NSMutableArray array];

    for (int i=0; i<currentViewControllers.count; i++) {
        UINavigationController *tempNav = [[UINavigationController alloc]init];
        tempNav = [currentViewControllers objectAtIndex:i];
        UIBarButtonItem *dismissButton = [[UIBarButtonItem alloc] 
                                          initWithTitle:@"Done"                                            
                                          style:UIBarButtonItemStyleBordered 
                                          target:self 
                                          action:@selector(dismissLibraryBrowser)];
        tempNav.navigationItem.rightBarButtonItem = dismissButton;
        [updatedViewControllers addObject:tempNav];
        [dismissButton release];
        [tempNav release];

        NSLog(@"Added controller number %d",i);
    }

    self.tabBarController.viewControllers = [NSArray arrayWithArray:updatedViewControllers];

    [self.view addSubview:tabBarController.view];
}

代码执行没有任何错误,但按钮没有出现。我确定我在这里误解了一些东西。希望得到一些指导。

【问题讨论】:

  • 您在选择标签项时是否检查了导航控制器的子视图......
  • 我为什么需要这样做?我只向导航控制器添加一个按钮。一切都很好,只是没有添加按钮。
  • 我从你的代码中看到了。。我仍然不在我的 MAC 中,所以如果你记录导航控制器的子视图,那么我们就可以确认按钮项是否仍然存在。 .
  • 您是如何将UITabBarController 嵌套在笔尖的UIViewController 中的?
  • @Paul.s 我没有!这是帖子中的一个错误,现在已修复。

标签: ios


【解决方案1】:

重新创建 viewControllers 和临时数组会使事情稍微复杂化。您只需要操作从笔尖加载的对象

[self.tabBarController.viewControllers enumerateObjectsUsingBlock:^(UINavigationController *navigationController, NSUInteger idx, BOOL *stop) {

    UIViewController *rootViewController = [navigationController.viewControllers objectAtIndex:0];

    UIBarButtonItem *rightBarButtonItem  = 
      [[UIBarButtonItem alloc] initWithTitle:@"Done"                                            
                                       style:UIBarButtonItemStyleBordered 
                                      target:self 
                                      action:@selector(dismissLibraryBrowser)];

    rootViewController.navigationItem.rightBarButtonItem = rightBarButtonItem;

 }];

至于您的应用程序的结构 - UITabBarController 的文档说

部署标签栏界面时,您必须将此视图安装为窗口的根目录。与其他视图控制器不同,标签栏界面永远不应安装为另一个视图控制器的子级。

所以我建议你看看重组一些东西,如果你只是偶尔需要它,为什么不考虑以模态方式呈现它?

【讨论】:

  • 没想到(就是模态视图),那我就重构一下。并感谢您的解决方案!
  • dismissLibraryBrowser 函数简单地用[self dismissModalViewControllerAnimated:YES]; 解除模态视图控制器。虽然这在每个选项卡的第一个视图控制器上都可以正常工作,但它在该选项卡中的任何其他推送视图控制器中都不起作用。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多