self.view = aViewController.view vs [aViewController loadView] -

时间:2010-01-09 15:54:14

标签: iphone uiviewcontroller loadview

我试图了解视图控制器从一个切换到另一个时的行为(显示不同的视图)

一个部分形成了似乎有效的addSubiew语句,我找不到对这两个语句会发生什么的解释:

self.view = someViewController.view; [someViewController loadView];

实际上我得到的情况是,只有第一个似乎工作(显示someViewController中定义的视图),而在另一种情况下只显示第二个。

更确切地说,从根viewController.view到anotherViewController.view(已经被证实)我必须使用第一个,回来我需要使用第二个。 我无法理解允许一个或另一个陈述工作的当前情况有什么不同。

谢谢

2 个答案:

答案 0 :(得分:3)

甚至很难理解你的问题。但我会尝试回答它:

iPhone OS使用一堆视图并向用户显示第一个视图。 您可以弹出(删除)或推送(添加)视图到此堆栈。

您提供的代码有点“模糊”。获得控制权的最佳方法是将SubView添加到您的窗口或任何其他视图

即。 [window addSubview:viewController.view];

请勿使用self.view = someViewController.view覆盖当前视图; 而是初始化新的ViewController并将其视图添加到当前视图的子视图中。

有任何问题吗?只是评论。

答案 1 :(得分:2)

您似乎对视图控制器的工作方式存在一些误解。

这两个陈述有几个问题:

self.view = someViewController.view;

根据UIViewController.view的文档:

“每个视图控制器对象是其视图的唯一所有者。您不能将同一视图对象与多个视图控制器对象关联。” -Apple Docs

一旦代码行执行,视图将有2个不同的控制器,这是不好的。

下一行:

[someViewController loadView];

这很糟糕,因为你永远不应该显式调用loadView。

来自UIViewController.loadView的文档:

“你不应该直接调用这种方法。”

来自UIViewController.view的文档:

“如果您访问此属性并且其值当前为nil,则视图控制器会自动调用loadView方法并返回结果视图。”

花些时间阅读viewController教程和指南,例如“适用于iPhone OS的View Controller编程指南”。他们是优秀的博士,可以教很多。