菜鸟教程小白 发表于 2022-12-12 10:02:26

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(@&#34;ChildViewController:viewWillAppear:&#34;);
}

@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]
查看完整版本: ios - 为什么即使 View Controller 没有显式添加为子项,外观方法也会被调用?