在presentViewController之后,模态viewcontroller UI没有响应:animated:completion:

我的应用程序有一个根视图控制器,在应用程序的开始显示

  • loginviewController视图,如果用户没有login
  • 主viewController视图,如果用户login

AppDelegate代码:

- (BOOL) application: (UIApplication*) application didFinishLaunchingWithOptions: (NSDictionary*) launchOptions { self.window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]]; self.window.rootViewController = [[RootViewController alloc] init]; [self.window makeKeyAndVisible]; return YES; } 

以下是RootViewController中使用的代码:

 @implementation RootViewController - (void) loadView { [super loadView]; // here mainViewController and loginNavigationController are initialized } ... - (UIView*) view { [super view]; // this invokes loadView return self.isLoggedIn ? self.mainViewController.view : self.loginNavigationController.view; } .... - (void) userDidLogin { [self.loginNavigationController presentViewController: self.mainViewController animated: YES completion: nil]; } @end 

如果用户没有login并按下loginbutton,则显示主视图控制器。

问题是在呈现主视图控制器之后,我无法与任何UI元素进行交互。 例如,我有一个tableView作为主viewController的子视图,当我尝试滚动它,我在debugging面板中得到以下警告:

  <UITableView: 0x202a4000; frame = (0 0; 310 548); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x1fd9f570>; layer = <CALayer: 0x1fdccff0>; contentOffset: {0, 0}>'s window is not equal to <RootViewController: 0x1fd9f7d0>'s view's window! 

好吧,看看更新的代码后,我看到你有一个rootViewController,并dynamic地给你认为应该呈现的视图。 事情是,rootViewController负责根视图,而另外两个视图控制器pipe理自己的视图。 你不应该传递一个不同的视图控制器的视图。

所以最终它看​​起来像你想有条件地设置你的rootviewcontroller。 所以让我们看看应用程序委托。 我想你应该让你的应用程序委托做这样的事情。 在运行时弄清楚哪个视图控制器要呈现。 然后使该应用程序的rootviewcontroller。

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { UIViewController * resolvedRootViewController = [self someMethodThatCorrectlyGivesRootViewController]; self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.window.rootViewController = resolvedRootViewController; [self.window makeKeyAndVisible]; return YES; }