要调用addChildViewController或不调用addChildViewController

时间:2015-09-02 02:50:43

标签: ios objective-c uiview uiviewcontroller

我对Objective-C和iOS相当新,而且我已经接受了其他人编写的应用程序。我注意到有些东西让我感动,我认为我的问题与人们对addChildViewController的其他问题略有不同。

嗯,应用程序运行正常。轮换工作正常。万事如意。 那么问题是什么?

那里有一个全屏视图,它以并排的平铺类型的布局包含一堆子视图。换句话说,它们都具有相同的全屏父视图,并且每个都是彼此的兄弟姐妹。 这些子视图都是var $title = $('#title'); $edit.on('froalaEditor.save.before', function (e, editor) { $edit.froalaEditor('option', 'saveParams', { title: $title.val() }); }); 的实例。 我曾期望看到这些子视图设置如下......

UIViewController

但他们只是这样做....

DoohickeyController *doohickey = [[DoohickeyController alloc] initWithNibName:@"Doohickey" bundle:nil];
[self addChildViewController:doohickey];
[self.view addSubview:doohickey.view];

当应用程序看起来运行正常时,是否有一条关于是否致电DoohickeyController *doohickey = [[DoohickeyController alloc] initWithNibName:@"Doohickey" bundle:nil]; [self.view addSubview:doohickey.view]; 的严格规则?

将呼叫添加到addChildViewController是否有任何优势/劣势?

2 个答案:

答案 0 :(得分:3)

UIKit中的一个主要设计假设是ViewController层次结构通常与View层次结构同步。处理自动旋转和大小类转换的回调通过ViewController链向下传递,如果您从未在ViewController之间创建父子关系,则此系统会崩溃。

我遵循(psudo代码)

的模式
//given:
ViewController *a;
ViewController *b;

[a willMoveToViewController:b];
[b addChildViewController:a];
[a didMoveToViewController:b];

[b.view addSubview:a.view];

答案 1 :(得分:2)

我认为其中一个原因可能是你的childViewController的所有权。

如果您在函数中alloc init,则该函数内的自动参数。当函数返回时,您的childViewController将自动释放,并变为nil

同时,你的childViewController的视图(doohickey.view),由于你addSubviewself.view,所以它将由self(viewController)保存。尽管VC已经nil,但该视图仍然存在。

所以addChildViewControllerself(viewController)保持doohickey(subviewController),因此doohickeydoohickey.view的所有权将统一,并且同时发布(self被释放后)。