2015-10-16 4 views
3

Я установил facebookSDK, а затем все требования, он работает, как я могу извлечь данные из учетной записи пользователя Facebook, однако я не могу выполнить SEGUE после входа в систему.Войти с FBSDK, не может выполнять SEGUE

я получаю сообщение об ошибке:

Предупреждение: Attempt to present <viewController1> on <FBSDKContainerViewController> whose view is not in the window hierarchy!

Вот мои коды:

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 


    if (FBSDKAccessToken.currentAccessToken() == nil) { 

     print("not logged in") 
    } 
    else { 

     print("logged in") 
    } 


    let loginButton = FBSDKLoginButton() 
    loginButton.readPermissions = ["public_profile", "email", "user_friends"] 
    loginButton.center = self.view.center 
    loginButton.delegate = self 
    self.view.addSubview(loginButton) 
} 

func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) { 


    if ((error) != nil) 
    { 

    } 
    else if result.isCancelled { 

    } 
    else { 

     if result.grantedPermissions.contains("email") 
     { 
      // Do work 

      returnUserData() 
      addViewHierarchy() 

      // self.performSegueWithIdentifier("signUpFollowPage", sender: self) 


     } 
    } 
} 

Любой может помочь? Спасибо

+0

Отправьте код, который показывает логин с FB. – Rumin

+0

Я добавил соответствующие коды. Спасибо – jim

+0

Такая же проблема, никаких «красивых» решений. Любые советы по этому поводу? –

ответ

7

Я боролся с той же проблемой (хотя я использую FBSDKLoginManagerlogInWithReadPermissions).

Хотя проблема заключается в том, что обратный вызов (или ваш вызов didCompleteWithResult) вызывается до того, как веб-просмотр Safari отклонен, я не могу найти подходящее решение.

Мой (ужасный) ответ был отсрочен, чтобы дать FBSDKContainerViewController время, которое нужно уволить естественным путем. В вашем случае:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(1 * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), {() -> Void in 
    self.performSegueWithIdentifier("signUpFollowPage", sender: self) 
} 

Возможно, вам будет легче уйти с более короткой задержкой.

Это поражает меня как ошибку в SDK для входа в Facebook. Если я найду время, я могу посмотреть на SDK source. К счастью, приложение, над которым я работаю, не должно выпускаться до нового года, поэтому я надеюсь, что проблема может быть исправлена ​​в более поздней версии в любом случае.

+1

Улучшение: проверьте, является ли 'self.view.window'' nil'. Если это не так, вы можете выполнить segue без какой-либо задержки. – bevoy

0

Я столкнулся с той же проблемой при входе в систему с FB. Вот как я это решил. Проблема во время навигации, FBContainerView по-прежнему открыт. Использование self.controller будет относиться к контроллеру FBContainerView и NOT Topmost и, следовательно, к навигации. Нам нужно будет вернуться к началу большинства контроллеров, а затем выполнить навигацию.

Вы можете сделать это без выполнения SEGUE, представляя вид контроллера от верхнего контроллера, как этот

let topController = self.topMostController() 
topController.presentViewController(secondController, animated: true, completion: nil) 

, чтобы получить самый верхний контроллер определяет метод, который всегда будет возвращать верхний контроллер

func topMostController()-> UIViewController { 
    var topController = UIApplication.sharedApplication().keyWindow?.rootViewController 

    while((topController?.presentedViewController) != nil){ 
     topController = topController?.presentedViewController 
    } 
    if(topController != nil){ 
     return topController! 
    } 
    else{ 
     return self 
    } 

} 
1

Вы должны использовать функцию viewDidAppear() и проверить FBSDKAccessToken.currentAccessToken:

override func viewDidAppear(animated:Bool){ 
    if FBSDKAccessToken.currentAccessToken() != nil{ 
    performSegueWithIdentifier("YOUR_SEGUE",sender:self) 
    } 
} 
Смежные вопросы