appDelegate 设置 rootViewController 和 viewWillAppear 不被调用?

Posted

技术标签:

【中文标题】appDelegate 设置 rootViewController 和 viewWillAppear 不被调用?【英文标题】:appDelegate set rootViewController and viewWillAppear is not called? 【发布时间】:2018-07-17 07:53:08 【问题描述】:

这是演示,我在didFinishLaunchingWithOptions 中设置了RootViewController,但是viewControllerviewWillAppear 没有被调用!我猜是因为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;

viewController.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

【问题讨论】:

self.window.rootViewController = navigationController @mag_zbc 与调用 viewwillappear 失败无关 我知道它应该设置为 self.window.rootViewController = navigationController;但我想知道我设置为 self.window.rootViewController = mainViewController;为什么不调用 mainViewController 的 viewWillAppear?谢谢。 【参考方案1】:

嗯...有趣。

保留以下内容:

[[UINavigationController alloc] initWithRootViewController:mainViewController];

虽然没用过,但好像在偷ViewController'sviewDidAppear

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

即:

- (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;

也许navigationController 被设置为拥有ViewController,但由于它没有显示在屏幕上,所以viewDidLoadviewDidAppear 都不会在以后出现,但是...当您将ViewController 重新分配给窗口,内部视图加载逻辑感觉不再需要调用viewDidAppear。 可能是错误或故意,我不知道。


注意:我真的没有理由这样做。我只是在解释造成它的原因。

【讨论】:

以上是关于appDelegate 设置 rootViewController 和 viewWillAppear 不被调用?的主要内容,如果未能解决你的问题,请参考以下文章

没有从 AppDelegate 设置 RootViewController?

如何在我的 AppDelegate 上设置多个本地通知?

Swift 在 AppDelegate 中延迟设置 rootViewController

在 AppDelegate.m 上设置 label.text

iOS 如何在 AppDelegate 中以编程方式设置侧边栏菜单?

如何在 appDelegate 方法上设置 Timer 时间表?