【发布时间】:2013-08-01 19:21:49
【问题描述】:
假设我有一个容器控制器,它接受一组 UIViewController 并将它们布置好,以便用户可以左右滑动以在它们之间切换。这个容器控制器被包裹在一个导航控制器中,并成为应用程序主窗口的根视图控制器。
每个子控制器向 API 发出请求并加载显示在表格视图中的项目列表。根据显示的项目,可以在导航栏中添加一个按钮,允许用户对表格视图中的所有项目进行操作。
由于 UINavigationController 仅使用其子视图控制器的 UINavigationItems,因此容器控制器需要更新其 UINavigationItem 以与其子视图控制器的 UINavigationItem 同步。
容器控制器似乎需要处理两种情况:
- 容器控制器的选定视图控制器发生变化,因此容器控制器的 UINavigationItem 应自行更新以模仿选定视图控制器的 UINavigationItem。
- 子控制器更新其 UINavigationItem 并且容器控制器必须知道更改并更新其 UINavigationItem 以匹配。
我想出的最佳解决方案是:
- 在setSelectedViewController:方法中查询选中视图控制器的导航项,更新容器控制器UINavigationItem的leftBarButtonItems、rightBarButtonItems和title属性与选中视图控制器的UINavigationItem一致。
- 在 setSelectedViewController 方法 KVO 中,选择视图控制器的 UINavigationItem 的 leftBarButtonItems、rightBarButtonItems 和 title 属性,以及每当这些属性之一更改容器控制器的 UINavigationItem 时。
这是我编写的许多容器控制器的一个反复出现的问题,我似乎找不到这些问题的任何记录解决方案。
人们针对这个问题找到了哪些解决方案?
【问题讨论】:
-
容器视图控制器能否覆盖
- (UINavigationItem *) navigationItem和只是return selectedViewController.navigationItem;? -
不能,因为当 selectedViewController 发生变化时,navigationItem 将不会被再次调用,因此 UINavigationController 仍将使用先前选择的视图控制器的 UINavigationItem。
-
这样的事情可能会奏效,但我没有尝试过:
+ (NSSet *)keyPathsForValuesAffectingNavigationItem { return [NSSet setWithObjects:@"selectedViewController", nil]; }。每当 selectedViewController 属性发生变化时,这都会触发 navigationItem 上的 KVO。我不确定UINavigationController是否正在使用 KVO 观察navigationItem。 -
我不认为 navigationItem 属性会改变,除了第一次调用延迟加载的方法。另外,如果您更新 UINavigationItem 上的属性,我认为不会触发针对 UIViewController 上的 navigationItem 属性的 KVO。
标签: ios cocoa-touch uinavigationcontroller uinavigationitem