首页 > 解决方案 > appDelegate 设置 rootViewController 和 viewWillAppear 不被调用?

问题描述

这是演示,我设置RootViewControllerdidFinishLaunchingWithOptions,但viewController没有viewWillAppear调用!我猜是因为NavigationController添加了ViewController消息的响应链失败了?

我知道它应该设置为

self.window.rootViewController = navigationController

但我想知道我设置了什么

self.window.rootViewController = mainViewController

为什么不打电话呢mainViewControllerviewWillAppear谢谢你。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor whiteColor];
    ViewController *mainViewController = [[ViewController alloc] init];
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:mainViewController];
    self.window.rootViewController = mainViewController;
    [self.window makeKeyAndVisible];

    return YES;
}

视图控制器.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
}

- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    NSLog(@"viewWillAppear");
}

@end

标签: iosobjective-c

解决方案


嗯……有趣。

保留以下内容:

[[UINavigationController alloc] initWithRootViewController:mainViewController];

即使它没有使用,似乎正在窃取ViewController's viewDidAppear.

如果您评论该行,那么它会按您的意愿工作。

IE:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {        
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor whiteColor];

    ViewController *mainViewController = [[ViewController alloc] init];

    //Comment the navigationController instantiation
    //UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:mainViewController];

    self.window.rootViewController = mainViewController;
    [self.window makeKeyAndVisible];

    return YES;
}

也许 thenavigationController被设置为拥有,ViewController但由于它没有出现在屏幕上,viewDidLoad直到viewDidAppear稍后才会出现,但是......当你重新分配ViewController给窗口时,内部视图加载逻辑感觉viewDidAppear不再需要被调用。
也许是一个错误或故意的,我不知道。


注意:我真的没有这种行为的理由。我只是在阐明造成它的原因。


推荐阅读