2013-03-21 7 views
0

내 앱 (기본 SDK : iOS5) 용 Facebook SDK 3.0 및 자습서로 맛있는 앱 (샘플 앱)을 사용하고 있습니다. Facebook 용 공개 세션이없는 경우 로그인보기 컨트롤러가 모달로 표시됩니다. 그러나 그것은 모달로 제시되지 않습니다. 다음은 코드입니다.AppDelegate에서 presentModalViewController를 호출하지 않음

- (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이 topViewController가 nil이 아닌, application:didFinishLaunchingWithOptions:에서 호출되는 및있는 navigationController가 viewDidLoad 방법 showLoginView에서
  • 라는 showLoginView 전에있는 navigationController의 호출
  • RootViewController
  • 을 할당 한 후 호출되는 (이해야한다 무엇이다 : RootViewController)
  • navigationController는 종류의 종류입니다 UINavigationController (custom가 아닙니다)
  • loginViewController (FacebookLoginViewController)의 방법이라고 init 있지만 그 방법 viewDidLoad)

로그 출력 :

2013년 3월 21일 20 : 01 : 28.729 RootViewController : viewDidLoad에

2013-03 -21 20 : 01 : 28.735 FacebookLoginViewController : Allocated

+0

presentModalViewController : animated :는 더 이상 사용되지 않습니다. 대신 presentViewController :를 사용해보십시오. – AMayes

+0

아직 표시되지 않았습니다. – Bartu

답변

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];

+0

presentViewController : animated : completion :, 행운을 보았습니다. 왜 내가 모달보기 컨트롤러를 강제해야하는지 모르겠다. – Bartu

+0

topViewController에서 modalViewController를 선언했다고 가정했습니다. 그렇지 않은 경우 topViewController에 FacebookLoginViewController를 선언하고 appDelegate의 loginViewController로 설정하여 topViewController에 대한 참조를 갖습니다. – AMayes

+0

나는 그것을 선언하기로되어 있지 않다. 모든 뷰 콘트롤러가이 뷰를 호출 할 수 있도록 코드의이 부분을 소유하는 전체 아이디어. – Bartu

5

는 주 스레드에서 실행되도록 UI 코드를 강제로 시도 변경 : 당신이 당신의 응용 프로그램의 창에 대한 참조를 유지한다고 가정

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

, 당신은 전화해야 [self.window.rootViewController present...]
또한 다른 VC가 이미 모달로 제공되는 경우 작동하지 않을 수도 있습니다 (대상 iOS 버전에 따라 다름) - 실제로는 "m"을 사용하는 방법 대신 presentViewController:animated:completion:을 사용해야합니다 odal "문구)

관련 문제