如何从其子容器访问容器视图控制器中的工具栏?

时间:2012-10-05 15:52:33

标签: objective-c ios ios5 uiviewcontroller uistoryboard

我的应用程序中有以下视图控制器结构:

带有UIToolBar(不是导航栏)的容器视图控制器嵌入了UIPageViewController,此UIPageViewController显示了其他子视图控制器:

container view controller (toolBar) -> PageViewController -> ViewController 1,
                                                             ViewController 2

我想在容器视图控制器的工具栏上添加和删除按钮(BarButtonItems),具体取决于所提供的子视图控制器1和2。

  1. 您如何推荐子视图控制器1和2 访问容器视图控制器中的工具栏以添加和 删除按钮?

  2. 似乎是容器视图中的toolbarItems属性 即使控制器中有按钮,控制器也始终为0。任何 关于为什么会这样的想法?是toolbarItems属性<> 0 仅适用于导航栏?

  3. 修改

    根据用户DBD的建议,我已将以下方法添加到视图控制器CompanyViewController,它具有工具栏,并且是拆分视图详细信息窗口中视图控制器的基类(我的所有详细信息视图控制器)继承自CompanyViewController)。其中一个详细视图控制器用作具有页面视图控制器和上述子视图控制器的内容视图控制器。

    CompanyViewController:

    - (void)addToolBarItems:(NSArray *)buttonArray
    {
        NSMutableArray *items = [[self.toolbar items] mutableCopy];
    
        [buttonArray enumerateObjectsUsingBlock:^(UIBarButtonItem *barButtonItem, NSUInteger idx, BOOL *stop) {
            if (! [items containsObject:barButtonItem] ) [items insertObject:barButtonItem atIndex:0];
        }];
        [self.toolbar setItems:items animated:NO];
    }
    
    - (void)removeToolBarItems:(NSArray *)buttonArray;
    {
        NSMutableArray *items = [[self.toolbar items] mutableCopy];
    
        [buttonArray enumerateObjectsUsingBlock:^(UIBarButtonItem *barButtonItem, NSUInteger idx, BOOL *stop) {
            if ( [items containsObject:barButtonItem] ) [items removeObjectAtIndex:idx];
        }];
        [self.toolbar setItems:items animated:NO];
    }
    

    这是我尝试从控制器访问CompanyViewController的方式:

    - (CompanyViewController*)parentViewControllerWithToolbar
    {
        UIViewController *parentPageViewController = self.parentViewController;
        CompanyViewController *parentContentViewController = (CompanyViewController*)parentPageViewController.parentViewController;
        return (CompanyViewController*)parentContentViewController;
    }
    

    但是,当尝试从子视图控制器调用addToolBarItems方法时,我无法在Xcodes的自动完成中获取该方法:即使我导入{{1},我似乎无法访问此方法}。

    有关我在这里可能缺少什么的任何建议吗?

1 个答案:

答案 0 :(得分:2)

我建议不要直接访问工具栏。相反,我建议容器类使用公共方法,如

- (void)addToolBarItem:(UIBarButtonItem *)button atIndex:(int)index;
- (void)removeToolBarItemAtIndex:(int)index;

然后你的孩子要做的就是得到父,可能做一个类型转换并调用方法。

封装您的UI更改会删除子类中可能重复的代码以修改工具栏,保护您的大部分代码免受Apple可能的API更改,并允许您轻松决定将工具栏更换为某些内容就像将来的自定义控件一样,不会引起波纹代码更改效果。

修改

我以为你使用的是容器视图控制器,而不是UISplitViewController。我将重新陈述我的理解,这样你就可以告诉我,如果我弄错了。

您有UISplitViewController显示“主”和“详细”视图。您希望详细视图回调到主服务器并请求更改工具栏。

在详细视图控制器中,您需要主控,但调用“父”只会为您提供UISplitViewController。因此,您必须访问拆分视图控制器并从那里获取主视图控制器。

MasterViewController *foo = [self.splitViewController.viewControllers objectAtIndex:0];
[foo removeToolBarItems:bar];

其中说,去获取我所属的UISplitViewController(与调用父相同),然后访问它所拥有的视图控制器数组。获取数组中的第一项并指定为主视图控制器。来自UISplitViewController

上的文档
  

viewControllers
  由接收器管理的视图控制器阵列。

     

@property(非原子,复制)NSArray * viewControllers

  讨论
  该   此属性中的数组必须包含两个视图控制器。该   视图控制器在拆分视图中从左到右显示   界面处于横向方向时。因此,观点   索引0处的控制器显示在左侧和视图中   索引1处的控制器显示在界面的右侧