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

iPhone UIKit阻止自定义视图控制器层次结构?,iphone,uikit,uiviewcontroller,Iphone,Uikit,Uiviewcontroller,有人能解释为什么不能在iPhone上使用UIKit创建自己的视图控制器层次结构吗 让我解释一下:当使用复杂的视图层次结构和导航逻辑创建应用程序时,最好使用专用的视图控制器来控制某些视图。这些控制器可以有自己的子控制器,等等。所有标准的东西真的 那么为什么parentViewController属性是只读的呢?UINavigationController和uitabarcontroller使用它,许多其他属性都依赖它(例如导航控制器属性) 我见过很多人告诉我们创建自己的属性来管理视图控制器层次结构

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

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

那么为什么parentViewController属性是只读的呢?UINavigationController和uitabarcontroller使用它,许多其他属性都依赖它(例如导航控制器属性)

我见过很多人告诉我们创建自己的属性来管理视图控制器层次结构,但当苹果自己的框架使用自己的私有“你不能碰它”层次结构模型时,这有点愚蠢。

你的问题与其说是个问题,不如说是个咆哮

parentViewController
仅在模态视图控制器演示中使用,如文档的“演示模态视图”部分所示。导航和选项卡栏控制器都有自己的属性(
navigationController
tabBarController
),可以作为父视图控制器访问它们,那么添加自己的属性有什么大不了的呢

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

您的问题与其说是一个问题,不如说是一个咆哮

parentViewController
仅在模态视图控制器演示中使用,如文档的“演示模态视图”部分所示。导航和选项卡栏控制器都有自己的属性(
navigationController
tabBarController
),可以作为父视图控制器访问它们,那么添加自己的属性有什么大不了的呢


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

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

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


为什么仅仅为了处理一个罕见的设计案例而冒着让API更脆弱的风险?在你想要一个灵活的层次结构的罕见情况下,你可以很容易地推出自己的产品

只读属性通常是实例必须一直设置以避免严重问题的属性

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


为什么仅仅为了处理一个罕见的设计案例而冒着让API更脆弱的风险?在你想要一个灵活的层次结构的罕见情况下,你可以很容易地推出自己的产品

完全同意本的观点。试着问相反的问题。为什么苹果在
UIViewController
中创建了
tabBarController
navigationController
属性。通过对
parentViewController
属性进行一些黑客攻击,可以很容易地完成这一点,但并不容易。在所有应用程序中,找到选项卡视图控制器都很常见:

UIViewController *current = ...;
while([current parentViewController] != nil) {
    current = [current parentViewController];
    if([current isKindOfClass:[UITabViewController class]]) {
        // do something
    }
}
是的,这可能违背直觉,因为导航或选项卡栏控制器很可能也是父视图控制器

实际上,使用
parentViewController
属性没有什么害处。要通过警告,请签出


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

完全同意Ben的观点。试着问相反的问题。为什么苹果在
UIViewController
中创建了
tabBarController
navigationController
属性。通过对
parentViewController
属性进行一些黑客攻击,可以很容易地完成这一点,但并不容易。在所有应用程序中,找到选项卡视图控制器都很常见:

UIViewController *current = ...;
while([current parentViewController] != nil) {
    current = [current parentViewController];
    if([current isKindOfClass:[UITabViewController class]]) {
        // do something
    }
}
是的,这可能违背直觉,因为导航或选项卡栏控制器很可能也是父视图控制器

实际上,使用
parentViewController
属性没有什么害处。要通过警告,请签出

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

解释您所说的“复杂”是什么意思,即您无法处理现有的系统

控制器可以有子控制器。。。您可以组合子客户机/视图并委派工作,也可以拥有复杂的控制器继承层次结构来管理行为

我希望看到一个具体的例子,说明你认为你不能做的事情。

解释你所说的“复杂”是什么意思,即你不能用现有的系统来做

控制器可以有子控制器。。。您可以组合子客户机/视图并委派工作,也可以拥有复杂的控制器继承层次结构来管理行为


我很想看到一个具体的例子,说明你认为自己做不到的事情。

这并不完全正确。您可以通过调用来设置parentViewController属性