2016-07-17 14 views
0

Ich habe einige Probleme mit der Implementierung von Facebook Login in meinem iOS, alles funktioniert einwandfrei, wenn der Benutzer noch nicht eingeloggt ist, die Anwendung die Daten von Facebook korrekt abruft und an die nächste Viewcontroller, statt, wenn bereits in ihm angemeldet ist, sollten auf eine Rekapitulation Seite automatisch segue, die Benutzer-Informationen zeigt, aber ich kann es nicht passieren, zur Zeit bin ich mit dieser Methode:ViewController wird geändert, wenn der Benutzer Facebook ist Angemeldet

override func viewDidLoad() { 
     super.viewDidLoad() 

     LoginButton.delegate = self 

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

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

aber in der Konsole i erhalten:

Facebook_Login.LoginViewController: 0x7fc04a519ca0 auf Facebook_Login.ViewController: 0x7fc04a41c1e0 Wessen Ansicht ist nicht in der Fensterhierarchie!

Ich habe auch versucht, die ViewDidAppear Methode verwendet, aber es segues auf die Rekapitulation Seite ohne die Variablen zu aktualisieren, so dass ich eine leere Seite

hier‘der vollständige Code erhalten:

View Controller 1

Import UIKit Import FBSDKLoginKit

Klasse 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:

Import UIKit Import FBSDKLoginKit

Klasse 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

Sind Sie sicher, Informationen korrekt zu aktualisieren? Wo aktualisieren Sie in Ihrer Zusammenfassung die UI-Elemente mit den Benutzerinformationen? –

+0

Ja absolut, wenn ich auf den Login Button klicke funktioniert alles gut ... wenn es hilfreich ist kann ich den kompletten Code hochladen –

+0

Du kannst, es ist immer einfacher herauszufinden, was los ist;) –

Antwort

0

aller Erstens vermeiden Ihre LoginButton.delegate in zurücksetzen die LoginAction() Funktion.

Wenn der Benutzer bereits angemeldet ist, einen nutzlosen Aufruf der Facebook Graph API zu vermeiden (wenn Sie nicht unbedingt benötigen, seine Informationen zu aktualisieren), können Sie speichern Ihre Benutzer Informationen in Coredata oder in einem NSUserDefault.

Wenn Sie es nie benutzt haben, können Sie die CDHelper-Lib (CoreDataHelper) verwenden, die Ihnen erlaubt, es ohne Schwierigkeiten zu benutzen.

Ich hoffe, ich war hilfreich, wenn nicht, zögern Sie nicht, uns ein Feedback zu geben.

BTW, in Ihrer viewDidAppear(animated: Bool) Funktion müssen Sie super.viewDidAppear(animated) aufrufen!

+0

Sie sind zu 100% richtig, btw Ich habe nie die Kerndaten verwendet, was sind sie Zweck? –

+0

Okay, CoreData ist eine der verschiedenen Möglichkeiten, um Daten im Gerät zu speichern.Sie müssen Ihr Projekt so konfigurieren, dass es CoreData verwenden kann. Alles ist in der [Apple Developer Dokumentation] (https://developer.apple.com/library/watchos/documentation/Cocoa/Conceptual/CoreData/index.html) erklärt. und die auf meiner Antwort erwähnte Bibliothek ist sehr hilfreich! –

+0

Ok, ich habe es, Sie schlagen vor, den Benutzer einzuloggen, holen Sie die Informationen, speichern Sie sie in den Kerndaten, dann zum zweiten View-Controller und lesen Sie die Kerndaten des Info-Formulars ohne die PreparerSegue-Methode? –

Verwandte Themen