gpt4 book ai didi

objective-c - 如何从其子项访问容器 View Controller 中的工具栏?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:19:24 26 4
gpt4 key购买 nike

我的应用程序中有以下 View Controller 结构:

带有UIToolBar(不是导航栏)的容器 View Controller 嵌入了UIPageViewController,而这个UIPageViewController 显示额外的 subview Controller :

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

我想根据显示的 subview Controller 1 和 2 在容器 View Controller 上的工具栏中添加和删除按钮 (BarButtonItems)。

  1. 您如何推荐 subview Controller 1 和 2访问容器 View Controller 中的工具栏以添加和移除按钮?

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

编辑

根据用户 DBD 的建议,我已将以下方法添加到 View Controller CompanyViewController 中,它具有工具栏并且是 Split View详细信息窗口中 View Controller 的基类(我所有的详细 View Controller 继承自 CompanyViewController)。这些详细信息 View Controller 之一用作内容 View Controller ,其中包含页面 View Controller 和上述 subview Controller 。

公司 View Controller :

- (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];
}

这就是我尝试从我的 Controller 访问CompanyViewController 的方式:

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

但是,当尝试从 subview Controller 调用 addToolBarItems 方法时,我无法在 Xcodes 的自动完成中获取该方法:似乎我无法访问此方法,即使我导入了 #import "CompanyViewController.h"

关于我在这里可能遗漏的内容有什么建议吗?

最佳答案

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

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

然后您的 child 所要做的就是获取父对象,可能进行类型转换并调用该方法。

像这样封装您的 UI 更改消除了子类中可能重复的代码来修改工具栏的需要,保护您的大部分代码免受 Apple 可能的 API 更改的影响,并允许您轻松决定将工具栏换成其他东西就像将来的自定义控件一样,不会引起涟漪代码更改效果。

编辑:

我以为您使用的是容器 View Controller ,而不是 UISplitViewController。我将重新陈述我的理解,以便您可以告诉我我是否理解错误。

您有一个显示“主” View 和“详细” View 的 UISplitViewController。您希望详细 View 回调主视图并请求更改工具栏。

在详细 View Controller 中,您需要主视图,但调用“parent”只会为您提供 UISplitViewController。因此,您必须访问 Split View Controller 并从那里获取主视图 Controller 。

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

也就是说,去获取我所属的 UISplitViewController(与调用父对象相同),然后访问它持有的 View Controller 数组。获取数组中的第一项并指定为主视图 Controller 。来自 UISplitViewController

上的文档

viewControllers
The array of view controllers managed by the receiver.

@property(nonatomic, copy) NSArray *viewControllers

Discussion
The array in this property must contain exactly two view controllers. The view controllers are presented left-to-right in the split view interface when it is in a landscape orientation. Thus, the view controller at index 0 is displayed on the left side and the view controller at index 1 is displayed on the right side of the interface

关于objective-c - 如何从其子项访问容器 View Controller 中的工具栏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12749801/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com