有谁可以解释为什么不可能在iPhone上使用UIKit创建自己的视图控制器层次结构?
让我解释一下:使用复杂的视图层次结构和导航逻辑创建应用程序时,最好让某些视图由专用的视图控制器控制。这些控制器可以有自己的子控制器,依此类推。所有标准的东西真的。
那么为什么 parentViewController 属性只读?它由 UINavigationController 和 UITabBarController 使用,许多其他属性依赖它(例如 navigationController 属性)。
我看到很多人告诉我们创建自己的属性来管理视图控制器层次结构,但是当Apple自己的框架使用自己的私有“你无法触及它”时,这有点傻层次模型。
答案 0 :(得分:2)
你的问题更像是一个咆哮而不是一个问题。
parentViewController
仅用于模态视图控制器演示,如文档的“演示模态视图”部分所示。导航和标签栏控制器每个都有自己的属性(分别为navigationController
和tabBarController
。),以便将它们作为父视图控制器进行访问,那么添加自己的属性有什么大不了的呢?
如果您想要自定义行为,则需要添加自定义代码。
答案 1 :(得分:2)
Readonly属性通常是实例必须始终设置的属性,以避免出现严重问题。
在可导航层次结构的这种情况下,子控制器必须始终能够访问父控制器。 (这是trait定义实际的导航层次结构,即您可以退出子视图。)如果属性是readwrite,它可能没有设置,可能没有正确设置或可能突然改变所有将孤立控制器。这在整个平台所依赖的API中是不可接受的。
为了处理罕见的设计案例,为什么冒险使API变得更脆弱?在您想要灵活的层次结构的罕见情况下,您可以轻松自行滚动。
答案 2 :(得分:0)
完全赞同本。试着问相反的问题。为什么Apple会在tabBarController
中创建navigationController
和UIViewController
属性。通过对parentViewController
属性进行一些黑客攻击,可以很容易地,很容易地实现这一点。找到标签视图控制器之类的东西在所有应用程序中都很常见:
UIViewController *current = ...;
while([current parentViewController] != nil) {
current = [current parentViewController];
if([current isKindOfClass:[UITabViewController class]]) {
// do something
}
}
是的,它可能违反直觉,因为导航或标签栏控制器很可能也是父视图控制器。
实际使用parentViewController
属性没有任何害处。要通过警告,请结帐this thread。
但是,一旦您在层次结构的父视图控制器中公开任何数据/行为,这些isKindOfClass
检查就会变得非常普遍。
答案 3 :(得分:0)
解释你所说的“复杂”是什么意思,你不能对系统进行处理。
控制器可以有子控制器......你可以编写子控制器/视图和委托工作,也可以使用复杂的控制器继承层次结构来管理行为。
我很想看到你认为你做不到的具体例子。