我正在为我的应用程序(基本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后调用RootViewController
在viewDidLoad
调用showLoginView
方法
showLoginView
中,topViewController
不是零(它应该是:RootViewController
)loginViewController
(FacebookLoginViewController
)的init
方法被调用,但不是viewDidLoad
方法)日志输出:
2013-03-21 20:01:28.729 RootViewController:viewDidLoad
2013-03-21 20:01:28.735 FacebookLoginViewController:已分配
答案 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:
而不是使用“模态”措辞的方法)