从AppDelegate调用presentModalViewController不起作用

时间:2013-03-21 18:03:19

标签: iphone ios cocoa-touch

我正在为我的应用程序(基本SDK:iOS5)使用Facebook SDK 3.0并使用Scrumptious应用程序(示例应用程序)作为教程。如果Facebook没有开放会话,则会以模态方式呈现登录视图控制器。但它没有以模态呈现。这是代码;

- (void)showLoginView {
    UIViewController *topViewController = [self.navigationController topViewController]; // not nil, RootViewController kind of class
    UIViewController *modalViewController = [topViewController modalViewController]; // nil since not modalviewcontroller exists

    if (![modalViewController isKindOfClass:[FacebookLoginViewController class]]) {
        FacebookLoginViewController *loginViewController = [[FacebookLoginViewController alloc] initWithNibName:@"FacebookLoginViewController" bundle:nil]; // allocated, no problem
        [topViewController presentModalViewController:loginViewController animated:NO]; // not working????

    } else {
        FacebookLoginViewController* loginViewController = (FacebookLoginViewController*)modalViewController;
        [loginViewController loginFailed];
    }
}

详细信息;

  • application:didFinishLaunchingWithOptions:调用showLoginView并在分配navigationController后调用
  • RootViewControllerviewDidLoad调用
  • 之前的navigationController调用showLoginView方法
  • showLoginView中,topViewController不是零(它应该是:RootViewController
  • navigationController是一种类UINavigationController(非自定义)
  • loginViewControllerFacebookLoginViewController)的init方法被调用,但不是viewDidLoad方法)

日志输出:

2013-03-21 20:01:28.729 RootViewController:viewDidLoad

2013-03-21 20:01:28.735 FacebookLoginViewController:已分配

3 个答案:

答案 0 :(得分:5)

尝试强制您的UI代码在主线程上运行:

dispatch_async(dispatch_get_main_queue(), ^{
    [topViewController presentModalViewController:loginViewController animated:NO];
});

答案 1 :(得分:1)

在你的topViewController中,声明一个FacebookLoginViewController的实例。 @property (nonatomic, strong) FacebookLoginViewController *fbVC;这将为viewController提供对要呈现的控制器的引用。它分配但不呈现的原因是因为您的topViewController当前被要求呈现它不拥有的对象。你需要传递它的所有权。

添加topViewController.fbVC = loginViewController;并将[topViewController presentModalViewController:loginViewController animated:NO];更改为[topViewController presentViewController:topViewController.fbVC animated:NO completion:nil];

答案 2 :(得分:0)

假设您保留对应用程序窗口的引用,您应该致电[self.window.rootViewController present...]
另请注意,当另一个VC已经以模态方式呈现时,它可能无效(取决于您的目标iOS版本 - 实际上您应该使用presentViewController:animated:completion:而不是使用“模态”措辞的方法)