在加载另一个ViewController时呈现一个模式视图控制器

用户可以使用我的应用程序之前,他必须login。 login后,数据库就build立了,因为我需要从服务器获取信息来构build它。

因此,我的根ViewController是LoginViewController,它提供了实际的应用程序(一个navigationController堆栈)模式上成功login。

如果用户在应用程序启动时已经login(我使用NSUserDefaults存储凭据),LoginViewController应该立即显示应用程序。 所以我重写了这个方法:

- (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; NSInteger userId = [[NSUserDefaults standardUserDefaults] integerForKey:@"selfUser"]; if (userId != 0) { //[self performSelector:@selector(presentMainViewController) withObject:nil afterDelay:2]; [self presentMainViewController]; } } - (void)presentMainViewController { mainViewController = [[MainViewController alloc] init]; mainViewController.managedObjectContext = managedObjectContext; navigationController = [[UINavigationController alloc] initWithRootViewController:mainViewController]; navigationController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; [self presentModalViewController:navigationController animated:NO]; } 

[self presentMainViewController]; 被执行,但控制器不显示。 如果我使用上面的线,它的工作。

我必须在哪里放置代码才能使其工作?

viewDidAppear发送时,视图堆栈可能不完全创build。 所以你应该使用perfomSelector:withDelay来把调用放到运行循环中。 通过这种方式,您可以确保代码运行时生成视图堆栈。

干杯!

我有类似的情况,我通过将代码移动到viewWillAppear(而不是viewDidAppear)解决。 这可能值得去尝试。