2016-07-17 6 views
0

iOSでFacebookのログインを実装するのにかなりの問題があります。ユーザーがまだログインしていないとすべて正常に動作します。アプリケーションはFacebookから正しくデータを取り出し、ユーザーがFacebookのログイン時にViewControllerを変更する

override func viewDidLoad() { 
     super.viewDidLoad() 

     LoginButton.delegate = self 

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

      self.performSegueWithIdentifier("Login", sender: self) 
     } 
    } 

が、コンソールI IN:すでにログインしている場合は、代わりに次のViewControllerは、自動的にユーザーの情報を示しますが、私はそれを実現することはできませんが、現在、私はこの方法を使用してい要約ページにセグエ必要があります取得:

Facebook_Login.LoginViewController:0x7fc04a519ca0 on Facebook_Login.ViewController:0x7fc04a41c1e0そのビューはウィンドウの階層にはありません!

ビューコントローラ1

:「完全なコードを私はまたviewdidAppearメソッドを使用して試してみたが、私はここに空のページに

を得るように、変数を更新せずに要約ページにsegues

インポートのUIKit インポートFBSDKLoginKit

クラスのViewController:のUIViewController、FBSDKLoginButtonDelegate {

var nome1:String = "" 
var cognome1:String = "" 
var email1:String = "" 
var compleanno:String = "" 
var città:String = "" 
var genere:String = "" 
var immagine_url:String = "" 

@IBOutlet weak var LoginButton: FBSDKLoginButton! 

@IBAction func LoginAction(sender: AnyObject) { 
    LoginButton.delegate = self 
    LoginButton.readPermissions = ["email"] 


} 

func FetchInfo(){ 

    print("scarico le informazioni...") 

    let parametri = ["fields":"email, first_name, last_name, birthday, hometown, gender, picture.type(large)"] 

    FBSDKGraphRequest(graphPath: "me", parameters: parametri).startWithCompletionHandler{(connection,result,error) -> Void in 

     if (error != nil){ 

      print ("errore") 
      return 
     } 

     else { 

      if let email = result["email"] as? String { 

       print(email) 
       self.email1 = email 
      } 

      if let nome = result["first_name"] as? String { 

       print(nome) 
       self.nome1 = nome 
      } 

      if let cognome = result["last_name"] as? String { 

       print(cognome) 
       self.cognome1 = cognome 
      } 

      if let compleanno = result["birthday"] as? String{ 

       print(compleanno) 
      } 

      if let città = result["hometown"] as? String{ 

       print(città) 
      } 

      if var genere = result["gender"] as? String{ 

       if (genere == "male"){ 

        genere = "maschio" 
       } 

       else { 

        genere = "femmina" 
       } 

       print(genere) 
      } 
     } 

     if let picture = result["picture"] as? NSDictionary, data = picture["data"] as? NSDictionary, url = data["url"] as? String{ 

      self.immagine_url = url 
      print(self.immagine_url) 


     } 

    } 

    return 
} 


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

    if (result.isCancelled == true){ 
     print("cancellato") 
    } 

    else { 

     print("login effettuato") 
     FetchInfo() 
     self.performSegueWithIdentifier("Login", sender: self) 
    } 

} 

func loginButtonDidLogOut(loginButton: FBSDKLoginButton!){ 

} 

func loginButtonWillLogin(loginButton: FBSDKLoginButton!) -> Bool{ 

    return true 
} 



@IBAction func returned(segue:UIStoryboardSegue){ 

} 



override func viewDidLoad() { 
    super.viewDidLoad() 

    LoginButton.delegate = self 

} 

override func viewDidAppear(animated: Bool) { 

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

     FetchInfo() 
     if(nome1 == ""){ 


         } 

     else { 
      self.performSegueWithIdentifier("Login", sender: self) 
     } 
    } 


} 


override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 

    let destinazione:LoginViewController = segue.destinationViewController 
    as! LoginViewController 

    destinazione.temp_nome = nome1 
    destinazione.temp_cognome = cognome1 
    destinazione.temp_email = email1 
    destinazione.img_profile_url = immagine_url 


} 

}

のViewController 2:

輸入のUIKit 輸入FBSDKLoginKit

クラスLoginViewController:のUIViewController、すべてのFBSDKLoginButtonDelegate {

var temp_nome = "" 
var temp_cognome = "" 
var temp_email = "" 
var img_profile_url:String = "" 


@IBOutlet weak var Nome_Utente: UILabel! 

@IBOutlet weak var email: UILabel! 

@IBOutlet weak var Immagine_Utente: UIImageView! 

@IBOutlet weak var Login_button: FBSDKLoginButton! 

@IBAction func Login_button_Action(sender: AnyObject) { 

    Login_button.delegate = self 
} 


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

} 

func loginButtonDidLogOut(loginButton: FBSDKLoginButton!){ 

    self.performSegueWithIdentifier("Back", sender: self) 
} 


override func viewDidLoad() { 
    super.viewDidLoad() 

    Nome_Utente.text = "\(temp_nome)" + " " + "\(temp_cognome)" 
    email.text = "\(temp_email)" 


} 



override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 
+0

情報を正しく更新してもよろしいですか?要約ビューで、ユーザーの情報でUI項目を更新する場所はどこですか? –

+0

はい、絶対に、ログインボタンをクリックしても問題ありません。役立つとすれば、完全なコードをアップロードすることができます –

+0

あなたは、何が間違っているかをいつでも簡単に把握できます;) –

答えて

0

まず、中にあなたのLoginButton.delegateをリセットするために避けますLoginAction()機能です。

ユーザーがすでにログインしている場合(あなたは、必ずしも彼の情報を更新する必要がない場合)、あなたはCoreDataまたはNSUserDefaultでユーザー情報を保存することができますFacebookのグラフAPIへの無用の呼び出しを避けるために、

CDHelper lib(CoreDataHelper)を使用していない場合は、問題なく使用できます。

希望していない場合は、私たちにフィードバックをお寄せください。

BtwのviewDidAppear(animated: Bool)機能では、super.viewDidAppear(animated)に電話する必要があります。

+0

あなたは100%正しいですか、私はコアデータを使用したことはありません、彼らは何を目的ですか? –

+0

さて、CoreDataは、デバイスにデータを保存するさまざまな方法の1つです。CoreDataを使用できるようにプロジェクトを設定する必要があります。すべてのことは[Apple Developper Documentation](https://developer.apple.com/library/watchos/documentation/Cocoa/Conceptual/CoreData/index.html)で説明されています。私の答えに記載されているライブラリは非常に便利です! –

+0

これで、ユーザーにログインし、情報をフェッチし、コアデータに格納し、2番目のView Controllerにセグして、preparerSegueメソッドを使用せずに情報フォームのコアデータを読み込むことをお勧めします。 –

関連する問題