2015-04-20 15 views
8

Xcode'ta bir UIView oluşturur ve sonra özel sınıfı FBSDKLoginButton olarak eklerseniz, tıklattığımda beni Facebook oturum açmaya yönlendirir ve sonra beni FBSDKLoginButton ile aynı sayfaya döndürür. Düğme şimdi diyor. Giriş butonu tıklandığında bunu yeni bir görünüme yönlendirmek için ne yapmalıyım? Facebook Giriş düğmesi Swift için


yüzden bu konuda karıştı onunla çalışan cocoapods ve benim ilk kez üzerinden Facebook SDK indirilen. Yardım için teşekkürler!

+0

Sen başarı-geri arama için kontrol etmelidir görünümünde (yani = başarı kaydedilir). Giriş yaptıysanız, başka bir görünüme "yönlendirebilirsiniz". –

+0

Bu aptalca bir soru olabilir, ancak denetleyicide gerçek bir kod olmadığı için bunu nasıl yaparım? – Soporificdreamer

cevap

20

Görünüm denetleyicinizi FBSDKLoginButton delege olarak ayarlamak ve düğme oturum açmak için kullanıldığında çağrılan loginButton:didCompleteWithResult:error: yöntemini uygulamak bir seçenek olacaktır.

Swift

class ViewController: UIViewController, FBSDKLoginButtonDelegate { 

    @IBOutlet weak var loginButton: FBSDKLoginButton!   

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.loginButton.delegate = self 
    } 
} 

Obj-C kontrol edebilirsiniz loginButton:didCompleteWithResult:error: yöntemde Sonra

// ViewController.h 
@interface ViewController : UIViewController <FBSDKLoginButtonDelegate> 

@property (weak, nonatomic) IBOutlet FBSDKLoginButton *loginButton; 

@end 

// ViewController.m 
@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.loginButton.delegate = self; 
} 

, result ve error ve her şey iyi ise, başka bir görünüme gidin .

Swift

func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) { 
     if ((error) != nil) { 
      // Process error 
     } 
     else if result.isCancelled { 
      // Handle cancellations 
     } 
     else { 
      // Navigate to other view 
     } 
    } 

Obj-C

// ViewController.m 
@implementation ViewController 

- (void)loginButton:(FBSDKLoginButton *)loginButton 
    didCompleteWithResult:(FBSDKLoginManagerLoginResult *)result 
        error:(NSError *)error { 
    if (error) { 
     // Process error 
    } 
    else if (result.isCancelled) { 
     // Handle cancellations 
    } 
    else { 
     // Navigate to other view 
    } 
} 

Sen their docs FB'nin ile giriş konusunda daha fazla bulabilirsiniz.

+0

Otomatik giriş nasıl çalışır? – jose920405

0

Sen appcoda bu öğretici gibi bu yapabileceğini İşte

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.title = @"Facebook Profile"; 

    // Check if user is cached and linked to Facebook, if so, bypass login  
    if ([PFUser currentUser] && [PFFacebookUtils isLinkedWithUser:[PFUser currentUser]]) { 
     [self.navigationController pushViewController: [[UserDetailsViewController alloc] initWithStyle:UITableViewStyleGrouped] animated:NO]; 
    } 

} 


#pragma mark - Login methods 

/* Login to facebook method */ 

- (IBAction)loginButtonTouchHandler:(id)sender { 
    // Set permissions required from the facebook user account 
    NSArray *permissionsArray = @[ @"user_about_me", @"user_relationships", @"user_birthday", @"user_location"]; 

// Login PFUser using facebook 
[PFFacebookUtils logInWithPermissions:permissionsArray block:^(PFUser *user, NSError *error) { 
    [_activityIndicator stopAnimating]; // Hide loading indicator 

    if (!user) { 
     if (!error) { 
      NSLog(@"Uh oh. The user cancelled the Facebook login."); 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Log In Error" message:@"Uh oh. The user cancelled the Facebook login." delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Dismiss", nil]; 
      [alert show]; 
     } else { 
      NSLog(@"Uh oh. An error occurred: %@", error); 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Log In Error" message:[error description] delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Dismiss", nil]; 
      [alert show]; 
     } 
    } else if (user.isNew) { 
     NSLog(@"User with facebook signed up and logged in!"); 
     [self.navigationController pushViewController:[[UserDetailsViewController alloc] initWithStyle:UITableViewStyleGrouped] animated:YES]; 
    } else { 
     NSLog(@"User with facebook logged in!"); 
     [self.navigationController pushViewController:[[UserDetailsViewController alloc] initWithStyle:UITableViewStyleGrouped] animated:YES]; 
     } 
    }]; 

    [_activityIndicator startAnimating]; // Show loading indicator until login is finished 
} 

bunun için bir demo app olan (aşağıdaki kodu bakınız).

+1

Bu, bana sadece burada iyi görülemeyen bir Bağlantı yanıtı olarak işaretlendiği için bir yorum kuyruğuna geldi. Bağlantıya yalnızca yanıtlar hakkındaki yoruma yanıt verdiğinizi görebiliyorum. Biraz biçimlendirme/yazım hatası düzenlemek için düzenledim. –

3
gibi bir şey olurdu Swift ise

: Swift, LoginButton delegesi için

@IBAction func unwindToViewOtherController(segue:UIStoryboardSegue) { 
    } 
+0

Teşekkürler tomurcuk .. Bunun bir pasajı kullanışlı olduğunu kanıtladı! –

+0

'performSegueWithIdentifier (" unwindToViewOtherController ", gönderen: self)' inside 'if (FBSDKAccessToken.currentAccessToken()! = Nil)' sonraki viewcontroller yüklenmiyor. Bu konuda bana yardımcı olur musun? – rAzOr

+0

Hikaye panosunda gevşetici sepeğini ve ardından öznitelik denetçisini seçin. Burada '' unwindToViewOtherController' '** Tanımlayıcı ** ve' unwindToViewOtherController: '** ** eylem ** olmalıdır. –

2

akım FacebookLogin sürümü (0.2.0) in:

class MyViewController: UIViewController, FBSDKLoginButtonDelegate { 
    @IBOutlet weak var loginView : FBSDKLoginButton! 
    @IBOutlet weak var profilePictureView : FBSDKProfilePictureView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.loginView.delegate = self 

     if (FBSDKAccessToken.currentAccessToken() != nil) 
     { 
      performSegueWithIdentifier("unwindToViewOtherController", sender: self) 
     } 
     else 
     { 
      loginView.readPermissions = ["public_profile", "email", "user_friends"] 
     } 

    } 

    func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) { 
     println("User Logged In") 

     if ((error) != nil) 
     { 
      // Process error 
     } 
     else if result.isCancelled { 
      // Handle cancellations 
     } 
     else { 
      // If you ask for multiple permissions at once, you 
      // should check if specific permissions missing 
      if result.grantedPermissions.contains("email") 
      { 
       // Do work 
      } 
     } 
    } 

    func loginButtonDidLogOut(loginButton: FBSDKLoginButton!) { 
     println("User Logged Out") 
    } 
} 

Ardından TargetViewController içinde bir çözülme işlevi ekleyin özellik güçlü özellik olarak tanımlanır:

public class LoginButton: UIView { 
... 
    /// Delegate of the login button that can handle the result, logout events. 
public var delegate: LoginButtonDelegate? 
... } 

Eğer oturum açmayı eklerseniz düğmesi

... Facebook talimatları ve düğme yetki vererek UIViewController çocuk sınıfını ayarlamak ... referans döngüsü oluşturulur. Görünüm, düğmeye güçlü bir referans içerecektir, düğme kontrolöre güçlü bir referans içerecektir ve kontrolör, görüşüne güçlü bir referans verecektir, bakınız bu post.

Çözümümün giriş düğmesine bir başvuru olması zayıf bir üye değişkeni kullanmaktı ve görünümü kaybolduğunda, düğme, temsilci nil olarak ayarlanır:

import UIKit 
import FacebookCore 
import FacebookLogin 
import RxSwift 

class LoginViewController: UIViewController, LoginButtonDelegate { 

    private weak var facebookLoginButton: LoginButton? = nil 

    override func viewDidLoad() { 

     super.viewDidLoad() 

     // Add the Facebook login button 
     let loginButton = LoginButton(readPermissions: [ .publicProfile, .email, .userFriends ]) 
     loginButton.center = view.center 
     // WARNING!: Facebook login button delegate property is defined currently as STRONG. 
     // Therefore, it must be set to nil before leaving the view to avoid reference cycles 
     loginButton.delegate = self 
     view.addSubview(loginButton) 
     // Store the login button as a weak reference, since it is holded by the main view with a 
     // strong reference 
     facebookLoginButton = loginButton 
    } 

    override func willMove(toParentViewController parent: UIViewController?) { 
     super.willMove(toParentViewController:parent) 
     if parent == nil { 
      // The back button was pressed, interactive gesture used, or programatically pop view 
      // was executed 
      // Do not forget to set delegate in Facebook button to nil to break reference cycle. 
      facebookLoginButton?.delegate = nil 
     } 
    } 

    // MARK: - Facebook login 

    /** 
    Called when the button was used to login and the process finished. 

    - parameter loginButton: Button that was used to login. 
    - parameter result:  The result of the login. 
    */ 
    func loginButtonDidCompleteLogin(_ loginButton: LoginButton, result: LoginResult) { 

     switch result { 
      case .failed(let error): 
       // Action on failed 
      case .cancelled: 
       // Action on cancelled 
      case .success(let grantedPermissions, let declinedPermissions, let accessToken): 
       // Action on success 
     } 
    } 

    /** 
    Called when the button was used to logout. 

    - parameter loginButton: Button that was used to logout. 
    */ 
    func loginButtonDidLogOut(_ loginButton: LoginButton) { 

     // Action on logout 
    } 
} 

fonksiyonunu viewWillDissapear() kullanmayın nil delegesini ayarlamak için, uygulamanızın üstünde Facebook giriş sayfası gösterilecek, bu işlevi tetikleyeceğiniz ve artık temsilci olmayacağınız için giriş sonucunu alamayacağınız için. Gezinme denetleyicisindeki görünümler için this solution'un düzgün çalıştığını unutmayın. Modal pencereler için başka bir çözüm bulunmalıdır. Ben yardımcı olur umarım

, Xavi

+2

"Bu bir yorum" diyerek satırları bırakırsanız ... bu aslında bana bir cevap gibi görünecektir ;-) – GhostCat

İlgili konular