appDelegate 设置 rootViewController 和 viewWillAppear 不被调用?
Posted
技术标签:
【中文标题】appDelegate 设置 rootViewController 和 viewWillAppear 不被调用?【英文标题】:appDelegate set rootViewController and viewWillAppear is not called? 【发布时间】:2018-07-17 07:53:08 【问题描述】:这是演示,我在didFinishLaunchingWithOptions
中设置了RootViewController
,但是viewController
的viewWillAppear
没有被调用!我猜是因为NavigationController
添加了ViewController
消息的响应链失败?
我知道应该设置为
self.window.rootViewController = navigationController
但我想知道我设置了什么
self.window.rootViewController = mainViewController
为什么不打电话给mainViewController
的viewWillAppear
?谢谢。
- (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's
viewDidAppear
。
如果您评论该行,那么它会按您的意愿工作。
即:
- (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
,但由于它没有显示在屏幕上,所以viewDidLoad
和viewDidAppear
都不会在以后出现,但是...当您将ViewController
重新分配给窗口,内部视图加载逻辑感觉不再需要调用viewDidAppear
。
可能是错误或故意,我不知道。
注意:我真的没有理由这样做。我只是在解释造成它的原因。
【讨论】:
以上是关于appDelegate 设置 rootViewController 和 viewWillAppear 不被调用?的主要内容,如果未能解决你的问题,请参考以下文章
没有从 AppDelegate 设置 RootViewController?
Swift 在 AppDelegate 中延迟设置 rootViewController
在 AppDelegate.m 上设置 label.text