FBSDKLoginButton nicht dynamisch erstellen lassen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • FBSDKLoginButton nicht dynamisch erstellen lassen

    Ein wunderschönen guten Tag zusammen,

    nach dem ich in meiner ersten App einen Facebook-Login eingebaut hatte und alles lief, bis auf die Rückleitung zum Startview nach dem Ausloggen,
    habe ich nun alles nochmal völlig neu aufgebaut, da der Weg, den ich vorher in einigen Anleitungen gefunden hatte, eben nur bis zu dem besagten
    Problem funktional war. (Die Logoutfunktion des FacebookSDKs wurde schlichtweg ignoriert, warum auch immer)

    Jetzt habe ich das ganze komplett neu programmiert und konnte sogar glücklicherweise die Objective-C Bride weglassen. Aber ich stehe vor einem Rätsel.
    Vielleicht ist es letztendlich auch ganz einfach. Jedenfalls komme ich aktuell nicht dahinter und hoffe einer von euch Experten weiß woran ich scheitere.

    Der Facebook-Button wird dynamisch über folgende Codezeilen erstellt:

    Quellcode

    1. var loginButton = FBSDKLoginButton()
    2. loginButton.readPermissions = ["public_profile","email","user_friends"]
    3. loginButton.center = self.view.center
    4. loginButton.delegate = self
    5. self.scrollview.addSubview(loginButton)
    Der Code bewirkt, dass der Button zentriert im View oder in meinem Fall im Scroll-View eingebunden wird.

    Da ich aber andere Elemente im Storyboard händisch hinzufüge, ist der Button nun öfters im Hintergrund.

    Ich habe mich seit gestern Nachmittag damit beschäftigt eine Lösung zu finden, um den Button anders positionieren
    zu können, leider ohne Erfolg.

    Weder über den Z-Index passiert da etwas, noch unterstützt FBSDKLoginButton ".top" oder ".bottom" statt ".center" :(

    Meine letzte Überlegung war, ob ich nicht im Storyboard einen Button erstellen kann, der dann als Facebook-Button genommen
    wird. Leider hat auch das nicht funktioniert.

    Daher meine Frage: Wie kann ich das Script oben so umändern, dass der Button nicht mehr dynamisch erstellt wird. Das ich quasi
    ein im Storyboard hinzugefügtes Element dafür verwenden kann?

    Vielen Dank für eure Tipps!

    Gruß
    David
  • DKCode schrieb:

    Daher meine Frage: Wie kann ich das Script oben so umändern, dass der Button nicht mehr dynamisch erstellt wird. Das ich quasi
    ein im Storyboard hinzugefügtes Element dafür verwenden kann?
    Dafür kannst du schon nen UIButton nehmen.
    Wenn man sich mal durch die Klassen klickt, sieht man das FBSDKLoginButton von FBSDKButton abgeleitet ist und dieser wiederum von UIButton
  • matz schrieb:

    DKCode schrieb:

    Daher meine Frage: Wie kann ich das Script oben so umändern, dass der Button nicht mehr dynamisch erstellt wird. Das ich quasi
    ein im Storyboard hinzugefügtes Element dafür verwenden kann?
    Dafür kannst du schon nen UIButton nehmen.Wenn man sich mal durch die Klassen klickt, sieht man das FBSDKLoginButton von FBSDKButton abgeleitet ist und dieser wiederum von UIButton
    Moin Matz,

    danke dir für die Antwort.

    Ich hab das bereits versucht aber Xcode schmeißt immer Fehlermeldungen.

    Mein Versuch sieht so aus:

    Quellcode

    1. @IBOutlet var FacebookBTN: UIButton!

    Somit ist der Button schon mal verknüpft. Anschließend das obige Script wie folgt angepasst:


    Quellcode

    1. FacebookBTN = FBSDKLoginButton()
    2. FacebookBTN.readPermissions = ["public_profile","email","user_friends"]
    3. //loginButton.center = self.view.center
    4. //loginButton.delegate = self
    5. //self.scrollview.addSubview(loginButton)
    Nun kommt es bei Zeile 2 zu einem Error "UIButton does not have a member named readPermissions"

    Wo liegt hier mein Fehler?
  • matz schrieb:

    DKCode schrieb:

    @IBOutlet var FacebookBTN: UIButton!
    ist schon mal falsch, da muss die FB-Klasse rein ;)

    DKCode schrieb:

    FacebookBTN = FBSDKLoginButton()
    Damit überschreibst du deinen angelegten Button wieder.

    Was genau ist daran falsch? Steht gerade auf dem Schlauch. Ich muss doch den UIButton
    im Script verknüpfen oder muss ich das nicht?

    Meinst du das so?

    Quellcode

    1. @IBOutlet var FacebookBTN: FBSDKLoginButton()
    Überschreiben wollte ich das gar nicht :D Eigentlich war mein Ziel dem UIButton so die FB-Klasse hinzuzufügen.

    Wie geht es denn sonst?

    Gruß
  • DKCode schrieb:

    Was genau ist daran falsch? Steht gerade auf dem Schlauch. Ich muss doch den UIButton
    im Script verknüpfen oder muss ich das nicht?
    Nein, du musst die Facebook-Klasse verknüpfen.

    DKCode schrieb:

    @IBOutlet var FacebookBTN: FBSDKLoginButton()
    Ist ja schon mal richtig.

    DKCode schrieb:

    FacebookBTN = FBSDKLoginButton()
    ist falsch.
    Das kannst du dir sparen.
    Durch das Outlet hast du schon eine Referenz.
  • Michael schrieb:

    matz schrieb:

    DKCode schrieb:

    @IBOutlet var FacebookBTN: FBSDKLoginButton()
    Ist ja schon mal richtig.
    Nein ist es nicht. Die runden Klammern am Ende sind zuviel.
    Danke das war schonmal die Lösung für die Error-Meldung :)

    Das gesamte Script sieht nun so aus:

    Quellcode

    1. import UIKit
    2. import FBSDKCoreKit
    3. import FBSDKLoginKit
    4. class ViewController: UIViewController, FBSDKLoginButtonDelegate{
    5. @IBOutlet var FacebookBTN: FBSDKLoginButton?
    6. @IBOutlet var scrollview: UIScrollView!
    7. override func viewDidLoad() {
    8. super.viewDidLoad()
    9. if(FBSDKAccessToken.currentAccessToken() == nil){
    10. println("not logged in...")
    11. }else{
    12. println("logged in")
    13. }
    14. //var loginButton = FBSDKLoginButton()
    15. //loginButton.readPermissions = ["public_profile","email","user_friends"]
    16. //loginButton.center = self.view.center
    17. //loginButton.delegate = self
    18. //self.scrollview.addSubview(loginButton)
    19. }
    20. override func didReceiveMemoryWarning() {
    21. super.didReceiveMemoryWarning()
    22. }
    23. func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) {
    24. if error == nil
    25. {
    26. println("Login complete")
    27. }else{
    28. println(error.localizedDescription)
    29. }
    30. }
    31. func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) {
    32. println("User Logged Out")
    33. }
    34. }
    Alles anzeigen

    Leider wird, wenn ich die App starte nur der "Button"-Text des UIButtons angezeigt.
    Und klick ich darauf passiert gar nichts. Also muss ich anscheint irgendwie auch noch die Action verknüpfen oder?

    und wo genau nutze ich diese Zeile um die Permissions festzulegen?


    Quellcode

    1. loginButton.readPermissions = ["public_profile","email","user_friends"]
    2. /*
    3. das geht natürlich wieder nicht ^^
    4. FacebookBTN.readPermissions = ["public_profile","email","user_friends"]
    5. */

    Oh man 3 Kreuze wenn ich aus dem "Swift-Noob"-Status raus bin :rolleyes:

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von DKCode ()

  • Das kann natürlich mal passieren :rolleyes:

    ich habe jetzt nochmal ein recherchiert und rausgefunden, das es in dieser Art und weise wohl gar nicht funktioniert.

    Möchte man einen UIButton verwenden muss man die FBSDKLoginManager() verwenden.

    Um das ganze in allen Views zugänglich zu machen habe ich die Funktionen als Extension verpackt.

    Hier der letztendliche Code falls jemand an der selben Stelle hängen bleibt:

    Quellcode

    1. // NEUE DATEI > FBFunctions.swift
    2. import UIKit
    3. import FBSDKCoreKit
    4. import FBSDKLoginKit
    5. extension UIViewController{
    6. func fbLoginInitiate() {
    7. let loginManager = FBSDKLoginManager()
    8. loginManager.logInWithReadPermissions(["public_profile", "email", "user_friends"], handler: {(result:FBSDKLoginManagerLoginResult!, error:NSError!) -> Void in
    9. if (error != nil) {
    10. // Process error
    11. self.removeFbData()
    12. } else if result.isCancelled {
    13. // User Cancellation
    14. self.removeFbData()
    15. } else {
    16. //Success
    17. if result.grantedPermissions.contains("email") && result.grantedPermissions.contains("public_profile") {
    18. //Do work
    19. self.fetchFacebookProfile()
    20. } else {
    21. //Handle error
    22. }
    23. }
    24. })
    25. }
    26. func removeFbData() {
    27. //Remove FB Data
    28. let fbManager = FBSDKLoginManager()
    29. fbManager.logOut()
    30. FBSDKAccessToken.setCurrentAccessToken(nil)
    31. println("logged out")
    32. }
    33. func fetchFacebookProfile()
    34. {
    35. if FBSDKAccessToken.currentAccessToken() != nil {
    36. let params = ["fields": "email, friends"]
    37. let graphRequest : FBSDKGraphRequest = FBSDKGraphRequest(graphPath: "me", parameters: params)
    38. graphRequest.startWithCompletionHandler({ (connection, result, error) -> Void in
    39. if ((error) != nil) {
    40. //Handle error
    41. } else {
    42. //Handle Profile Photo URL String
    43. let userId = result["id"] as! String
    44. let profilePictureUrl = "https://graph.facebook.com/\(userId)/picture?type=large"
    45. let accessToken = FBSDKAccessToken.currentAccessToken().tokenString
    46. let fbUser = ["accessToken": accessToken, "user": result]
    47. println(fbUser)
    48. println("logged in")
    49. }
    50. })
    51. }
    52. }
    53. }
    Alles anzeigen
    Der Aufruf in dem View sieht dann wie folgt aus:


    Quellcode

    1. import UIKit
    2. import FBSDKCoreKit
    3. import FBSDKLoginKit
    4. class ViewController: UIViewController{
    5. @IBOutlet var FacebookBTN: UIButton!
    6. @IBAction func FacebookBTNpressed(sender: AnyObject) {
    7. fbLoginInitiate()
    8. }
    9. override func viewDidLoad() {
    10. super.viewDidLoad()
    11. if(FBSDKAccessToken.currentAccessToken() == nil){
    12. println("not logged in...")
    13. }else{
    14. println("logged in")
    15. }
    16. }
    17. override func didReceiveMemoryWarning() {
    18. super.didReceiveMemoryWarning()
    19. }
    20. }
    Alles anzeigen
    und siehe da es geht tatsächlich :D


    Ich danke euch für eure Zeit, Geduld und Tipps ! :rolleyes:

    Gruß
  • matz schrieb:

    Vlt. hätte dir das auch geholfen

    developers.facebook.com/docs/f…n/ios#custom-login-button

    Brauchst aber eben noch die Grafik ...
    Das hatte ich auch schon entdeckt, leider aber stehen die eigenen Facebook-Anleitungen nur in Objective-C geschrieben.
    Ein bisschen was kann ich da ableiten, aber da ich dieses Jahr mit der Ios-Appentwicklung mit Swift angefangen habe ist mir vieles
    leider noch zu unklar.

    Aber es ist ja noch kein Meister vom Himmel gefallen :D

    Bei der Webentwicklung kann ich auch erst nach 11 Jahren sagen, das jetzt so ziemlich alles klar ist, abgesehen von den
    neuen Entwicklungen alias Node.js und Co. Aber man lernt ja nie aus, das ist das Schöne an dem Beruf :thumbsup: