2016-05-29 6 views
0

Ich baue eine App mit Swift, die Ihre E-Mail-Adresse, Ihren Vornamen und Ihren Nachnamen von Ihrem Facebook-Profil abruft und zeigt es auf dem Bildschirm an.Wenn ich versuche, den Text eines UIlabels zu ändern, erhalte ich in Swift eine unerwartete Nil-Entpackung. Swift

Um es einfacher zu machen, konzentriere ich mich darauf, die E-Mail zu arbeiten, und dann werde ich am Vor- und Nachnamen arbeiten.

Ich habe ein Label mit dem Namen EmailLabel erstellt, das die E-Mail-Adresse auf dem Bildschirm anzeigen soll. Allerdings, wenn ich versuche EmailLabel Text auf die tatsächliche E-Mail-Adresse zu ändern, erhalte ich die

Thread1: EXC_BAD_INSTRUCTION ERROR (code=EXC_1386_INVOP, subcode=0x0) 

und die

fatal error:unexpectedly found nil while unwrapping an Optional value 

Nachricht.

Ich weiß, dass das EmailLabel immer als Null auspacken. Um dies zu beheben, schrieb ich:

self.EmailLabel = UILabel() 

Es hielt mich den Fehler geben, aber die EmailLabel würde nicht den Text der eigentlichen E-Mail-Adresse aktualisieren.

Ich würde wirklich jede Hilfe schätzen! By the way, ich bin ganz neu in die Programmierung so versuchen Sie es eine einfache Antwort :)

import UIKit 
import FBSDKCoreKit 
import FBSDKLoginKit 

class ViewController: UIViewController, FBSDKLoginButtonDelegate { 

@IBOutlet var EmailLabel: UILabel! 
@IBOutlet var SomeLabel: UILabel! 

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

    var 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!) { 

    fetchProfile() 
    if error == nil 
    { 
     print("Login complete") 
     self.performSegueWithIdentifier("showInfo", sender: nil) 
    } 
    else 
    { 
     print(error.localizedDescription) 
    } 
} 

func fetchProfile(){ 
    print("fetchProfile") 

    let parameters = ["fields": "email, first_name, last_name"] 
    FBSDKGraphRequest(graphPath: "me", parameters: parameters).startWithCompletionHandler { (connection, result, error) -> Void in 

     if error != nil{ 
      print(error) 
      return 
     } 

     if var email = result["email"] as? String { 
      print(email) 
      self.EmailLabel.text = "\(email)" 
     } 

     if let first_name = result["first_name"] as? String { 
      print(first_name) 
     } 

     if let last_name = result["last_name"] as? String { 
      print(last_name) 
     } 
    } 
} 

func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) { 

} 

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


} 

Ich habe versucht, suchen Sie in anderen Fragen zu geben, aber es funktioniert nicht

Gibt es einen Grund für das Label eine Null sein abgesehen von dem IB Outlet nicht verbunden sein?

+0

Wahrscheinlich dies: http://stackoverflow.com/a/33129428/2227743 – Moritz

+0

Prüfen Sie die IB Ausgang für 'EmailLabel' verbunden ist, dass Konvention besagt, auch sollte die Eigenschaften beginnen mit einem Kleinbuchstaben (dh 'emailLabel') – Hamish

+0

Versuchen Sie, die Bezeichnung in der Hauptwarteschlange thread – iYoung

Antwort

0

Ihre Steckdose ist wahrscheinlich getrennt. Cmd + click von der Marke zu Ihrem Outlet in Ihrem Code, und Ihr Etikett wird nicht mehr Null sein.

2

ich eine if-Anweisung in der ViewDidLoad Funktion hinzugefügt: wenn emailLabel = nil { fetchProfile() } und es funktionierte!

Vielen Dank für Ihre Hilfe