我对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
是否有任何优势/劣势?
答案 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
),由于你addSubview
到self.view
,所以它将由self
(viewController)保存。尽管VC已经nil
,但该视图仍然存在。
所以addChildViewController
让self
(viewController)保持doohickey
(subviewController),因此doohickey
和doohickey.view
的所有权将统一,并且同时发布(self
被释放后)。