3

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

带有(不是导航栏)的容器视图控制器有一个嵌入的,这提供了额外的子视图控制器:UIToolBarUIPageViewControllerUIPageViewController

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

我想根据呈现的子视图控制器 1 和 2 在容器视图控制器上的工具栏中添加和删除按钮 (BarButtonItems)。

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

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

编辑

根据用户 DBD 的建议,我已将以下方法添加到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 的自动完成中获取该方法:即使我导入了#import "CompanyViewController.h".

关于我可能在这里遗漏的任何建议?

4

1 回答 1

3

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

- (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(nonatomic, copy) NSArray *viewControllers

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

于 2012-10-05T16:45:20.683 回答