iPhone UIKit会阻止自定义视图控制器层次结构?

时间:2009-12-15 19:38:19

标签: iphone uikit uiviewcontroller

有谁可以解释为什么不可能在iPhone上使用UIKit创建自己的视图控制器层次结构?

让我解释一下:使用复杂的视图层次结构和导航逻辑创建应用程序时,最好让某些视图由专用的视图控制器控制。这些控制器可以有自己的子控制器,依此类推。所有标准的东西真的。

那么为什么 parentViewController 属性只读?它由 UINavigationController UITabBarController 使用,许多其他属性依赖它(例如 navigationController 属性)。

我看到很多人告诉我们创建自己的属性来管理视图控制器层次结构,但是当Apple自己的框架使用自己的私有“你无法触及它”时,这有点傻层次模型。

4 个答案:

答案 0 :(得分:2)

你的问题更像是一个咆哮而不是一个问题。

parentViewController仅用于模态视图控制器演示,如文档的“演示模态视图”部分所示。导航和标签栏控制器每个都有自己的属性(分别为navigationControllertabBarController。),以便将它们作为父视图控制器进行访问,那么添加自己的属性有什么大不了的呢?

如果您想要自定义行为,则需要添加自定义代码。

答案 1 :(得分:2)

Readonly属性通常是实例必须始终设置的属性,以避免出现严重问题。

在可导航层次结构的这种情况下,子控制器必须始终能够访问父控制器。 (这是trait定义实际的导航层次结构,即您可以退出子视图。)如果属性是readwrite,它可能没有设置,可能没有正确设置或可能突然改变所有将孤立控制器。这在整个平台所依赖的API中是不可接受的。

为了处理罕见的设计案例,为什么冒险使API变得更脆弱?在您想要灵活的层次结构的罕见情况下,您可以轻松自行滚动。

答案 2 :(得分:0)

完全赞同本。试着问相反的问题。为什么Apple会在tabBarController中创建navigationControllerUIViewController属性。通过对parentViewController属性进行一些黑客攻击,可以很容易地,很容易地实现这一点。找到标签视图控制器之类的东西在所有应用程序中都很常见:

UIViewController *current = ...;
while([current parentViewController] != nil) {
    current = [current parentViewController];
    if([current isKindOfClass:[UITabViewController class]]) {
        // do something
    }
}

是的,它可能违反直觉,因为导航或标签栏控制器很可能也是父视图控制器。

实际使用parentViewController属性没有任何害处。要通过警告,请结帐this thread

但是,一旦您在层次结构的父视图控制器中公开任何数据/行为,这些isKindOfClass检查就会变得非常普遍。

答案 3 :(得分:0)

解释你所说的“复杂”是什么意思,你不能对系统进行处理。

控制器可以有子控制器......你可以编写子控制器/视图和委托工作,也可以使用复杂的控制器继承层次结构来管理行为。

我很想看到你认为你做不到的具体例子。