1

我的应用程序有一个根的ViewController,其在该应用显示模态的ViewController UI不响应presentViewController后:动画:完成:

  • 登录的viewController视图的开始,如果用户没有在
  • 登录
  • 主要的viewController视图如果用户在

的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呈现。

问题是,在呈现主视图控制器后,我无法与任何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

您所覆盖的视图方法位于何处?在应用程序委托?我觉得像那样动态返回视图不是正确的方法。 你应该总是推送或呈现你的下一个视图控制器,框架应该自动显示给你,你不应该告诉它哪个视图呈现。 – feliun

+0

@feliun,请查看我更新的答案。我没有提到过我已经在几个应用程序中使用过这种方法,并且它的工作完美无瑕。这是我第一次得到这个错误。 – NikGreen

回答

1

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

所以最终它看​​起来像你想有条件地设置你的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; 
} 
+1

ОК,几个小时后,我发现问题是由一个错误的活动指标引起的。我会接受你的回答,但我仍然认为我的方法也是可行的。感谢你的时间@feliun! – NikGreen

相关问题