0

私は自分のアプリ(ベース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];
    }
}

詳細;

  • showLoginViewはからapplication:didFinishLaunchingWithOptions:呼び出され、navigationControllerが割り当てられた後に呼び出されます
  • RootViewController呼び出される前のnavigationControllerの呼び出しviewDidLoadメソッドのshowLoginView
  • showLoginViewtopViewControllernilではありません(これは、あるべきものですRootViewController:)
  • NavigationControllerは一種のクラスUINavigationControllerです(カスタムではありません)
  • loginViewControllerFacebookLoginViewController)のinitメソッドが呼び出されますが、そのviewDidLoadメソッドは呼び出されません)

ログ出力:

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

2013-03-21 20:01:28.735 FacebookLoginViewController:割り当てられました

4

3 に答える 3

5

UIコードをメインスレッドで実行するように強制してみてください。

dispatch_async(dispatch_get_main_queue(), ^{
    [topViewController presentModalViewController:loginViewController animated:NO];
});
于 2013-03-21T18:51:09.153 に答える
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];

于 2013-03-21T18:49:10.613 に答える
0

アプリケーションのウィンドウへの参照を保持していると仮定すると、呼び出す必要があります。[self.window.rootViewController present...]
また、別の VC が既にモーダルに表示されている場合は機能しない可能性があることに注意してください (対象の iOS バージョンによって異なります。実際にはpresentViewController:animated:completion:、「モーダル」表現を使用するメソッドの代わりに使用する必要があります)。

于 2013-03-21T19:31:31.167 に答える