ios - 为什么即使 View Controller 没有显式添加为子项,外观方法也会被调用?
<p><p>在研究容器 ViewController 以尝试重构某些代码时,我遇到了一些我不理解的东西。 </p>
<p>Apple 文档告诉我,为了让 subviewController 调用其外观方法,必须使用 <code>addChildViewController:</code></p> 将它们作为 subviewController 添加到父 ViewController 中
<p>这让我感到困惑,因为我的代码没有使用任何容器 ViewController 方法,但我的所有 subviewController 都收到了 <code>viewWillAppear:</code> 消息。 </p>
<p>我将代码简化为这个简单的示例,尽管调用了 <code>addChildViewController:</code></p>,但您仍会在调试日志中看到“ChildViewController:viewWillAppear:”
<pre><code>@interface ChildViewController : UIViewController
@end
@implementation ChildViewController
- (void)loadView {
self.view = [ initWithFrame:CGRectMake(10.0f, 10.0f, 250.0f, 250.0f)];
}
- (void)viewWillAppear:(BOOL)animated {
;
NSLog(@"ChildViewController:viewWillAppear:");
}
@end
@interface RootViewController : UIViewController
@property (strong) ChildViewController *cvc;
@end
@implementation RootViewController
@synthesize cvc;
- (void)loadView {
UIView *view = [ initWithFrame:CGRectMake(10.0f, 10.0f, 500.0f, 500.0f)];
cvc = [ init];
];
self.view = view;
}
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [ initWithFrame:[ bounds]];
self.window.rootViewController = [ init];
;
return YES;
}
@end
</code></pre>
<p>为什么会这样?</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>调用<code>addSubview</code>的过程会导致 View 出现,从而导致<code>loadView</code>、<code>viewDidLoad</code>、<code>viewWillAppear </code>、<code>viewDidAppear</code> 等,调用。 <code>addChildViewController</code> (以及您也应该执行的对 <code>didMoveToParentViewController</code> 的调用)不会影响这一点。 </p>
<p>您调用 <code>addChildViewController</code> 以确保您的 Controller 层次结构与 View 层次结构保持同步。如果您不这样做,您将无法将某些事件传递给您的子 Controller (例如旋转事件)。此外,通过执行 <code>addChildViewController</code>,您的 Controller 将为您保留,而您无需维护自己的属性来跟踪子 Controller 。</p>
<p>如果您看到 <a href="https://developer.apple.com/videos/wwdc/2011/?id=102" rel="noreferrer noopener nofollow">WWDC 2011 - #201 Implementing UIViewController Containment</a> ,它将讨论保持 View 层次结构和 Controller 层次结构同步的重要性。</p></p>
<p style="font-size: 20px;">关于ios - 为什么即使 ViewController 没有显式添加为子项,外观方法也会被调用?,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/15774605/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/15774605/
</a>
</p>
页:
[1]