我的应用有一个根视图控制器,它在应用程序的开头显示
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
如果用户未登录并按下登录按钮,则会显示主viewController。
问题是在呈现主viewController之后,我无法与任何UI元素进行交互。例如,我有一个tableView作为主viewController的子视图,当我尝试滚动它时,我在调试面板中收到以下警告:
<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!
答案 0 :(得分:1)
好的,所以在查看更新后的代码之后,我看到你有一个rootViewController并且动态地给出你认为应该呈现的视图。问题是,rootViewController负责根视图,而其他两个视图控制器管理自己的视图。您不应该关闭其他视图控制器的视图。
所以最后看起来你想有条件地设置你的rootviewcontroller。所以让我们来看看app delegate。我认为你应该让你的app委托做这样的事情。让它在运行时弄清楚哪个viewcontroller呈现。然后将其作为应用程序的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;
}