【问题标题】:Modal viewcontroller UI not responsive after presentViewController:animated:completion:模态视图控制器 UI 在 presentViewController:animated:completion 后没有响应:
【发布时间】:2013-07-16 14:42:36
【问题描述】:

我的应用有一个根视图控制器,在应用开始时会显示它

  • login viewController view 如果用户没有登录
  • 主 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!

【问题讨论】:

  • 您覆盖的视图方法位于何处?在应用程序委托中?我觉得像这样动态返回视图不是正确的方法。您应该始终推送或呈现框架应该自动为您显示的下一个视图控制器,您不必告诉它要呈现哪个视图。
  • @feliun,请查看我的更新答案。我没有提到我之前在几个应用程序中使用过这种方法并且它完美地工作。这是我第一次收到此错误。

标签: ios user-interface modalviewcontroller presentmodalviewcontroller


【解决方案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;
}

【讨论】:

  • ОК,几个小时后,我发现问题是由错误的活动指示器引起的。我会接受你的回答,但我仍然认为我的方法也是可行的。谢谢你的时间,@feliun!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多