ios - 知道何时在 ios 中按下 facebook 登录按钮

标签 ios objective-c facebook facebook-login facebook-ios-sdk

我想在有人按下 facebook 登录按钮时显示一个 HUD。目前我很难知道什么时候按下了按钮。

我试图捕获 View 的所有点击,但这对 facebook 按钮上的任何共鸣都不起作用......

如何知道何时按下 facebook 登录,调用我的 HUD?

另外,如果知道 facebook 登录按钮触发哪个功能会更好。找不到..

在 LoginViewController.m 中获取水龙头的代码(已更新,可行的解决方案)

// workaround to find out when user tapped the login button
-(void)addTapFinder {
    UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped)];

    tapped.numberOfTapsRequired = 1;
    tapped.delegate = self;
    tapped.cancelsTouchesInView = NO;

    FBLoginView *fbButton = [[FBLoginView alloc] init];
    UIView * fbView = (UIView *)fbButton;
    fbView = [self.view viewWithTag:fbloginViewTAG];

    [fbView addGestureRecognizer:tapped];

    DLog(@"found View %@", fbView);
}


-(void)tapped {
    DLog(@"tapped");
}

调试器日志

[872:60b] -[LoginViewController FacebookLogin] [Line 283] loginview subviews: <FBShadowLabel: 0x16d17840; baseClass = UILabel; frame = (33 -1; 168 46); text = 'Connect  Facebook'; autoresize = W; userInteractionEnabled = NO; layer = <CALayer: 0x18136240>>
[872:60b] -[LoginViewController showFBLogin] [Line 231] show login View
[872:60b] -[LoginViewController tapped] [Line 250] tapped   // tapped somewhere in self.view, but not the login button
// tapped the login button, no "tapped" entry in the logfile

完整代码如下:

登录 View Controller .h

#import <UIKit/UIKit.h>
#import <FacebookSDK/FacebookSDK.h>
#import "WebApi.h"
#import "SVProgressHUD.h"

@interface LoginViewController : UIViewController <FBLoginViewDelegate, UIGestureRecognizerDelegate>

-(IBAction)toSurroundView;

@property (nonatomic, strong) WebApi *swebapi;
@property (nonatomic) BOOL isFirstFBLoginDone;
@property (weak, nonatomic) IBOutlet UIView *loginView;

@end

登录 View Controller .m

#import "LoginViewController.h"

@interface LoginViewController ()
@end

@implementation LoginViewController


static int const fbloginViewTAG = 203;

-(void)vinit {
    self.swebapi = [[WebApi alloc] init];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:@"didRegisterUser" object:nil ];
    self.isFirstFBLoginDone = FALSE;
}

- (void)viewDidLoad
{
    [self vinit];
    [super viewDidLoad];
    [self showFBLogin];
}


-(void)handleNotification:(NSNotification *)message {
    if ([[message name] isEqualToString:@"didRegisterUser"]) {
        [self toSurroundView];
    }
}

-(IBAction)toSurroundView {
    [SVProgressHUD dismiss]; // connecting to Facebook, this is called to late!

    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *surroundViewController = [mainStoryboard instantiateInitialViewController];
    surroundViewController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self presentViewController:surroundViewController animated:YES completion:nil];
}

#pragma mark - Facebook Things

-(void)showFBLogin {
    UIView *connectView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
    [self.view addSubview:connectView];
    [self FacebookLogin];   
    [self addTapFinder]; 
    DLog(@"show login View");
}

// workaround to find out when user tapped the login button
-(void)addTapFinder {
    UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped)];

    tapped.numberOfTapsRequired = 1;
    tapped.delegate = self;
    tapped.cancelsTouchesInView = NO;

    FBLoginView *fbButton = [[FBLoginView alloc] init];
    UIView * fbView = (UIView *)fbButton;
    fbView = [self.view viewWithTag:fbloginViewTAG];

    [fbView addGestureRecognizer:tapped];

    DLog(@"found View %@", fbView);
}

-(void)tapped {
    DLog(@"tapped");
}

-(void)FacebookLogin {

    // https://developers.facebook.com/docs/ios/login-ui-control/
    // https://developers.facebook.com/docs/ios/session/

    FBLoginView *loginView = [[FBLoginView alloc] init];
    loginView.delegate = self;
    loginView.tag = fbloginViewTAG;
    loginView.readPermissions = @[@"email", @"basic_info"];
    loginView.frame = CGRectOffset(loginView.frame,
                                   (self.view.center.x - (loginView.frame.size.width / 2)),
                                   ([[UIScreen mainScreen] bounds].size.height - 80));

    // change fb login button text
    UILabel *fblabel = [loginView subviews][1];
    fblabel.text = @"Connect  Facebook";

    DLog(@"loginview subviews: %@", [loginView subviews][1]);

    [self.view addSubview:loginView];
    [loginView sizeToFit];

}

- (void)loginViewFetchedUserInfo:(FBLoginView *)loginView
                            user:(id<FBGraphUser>)user {

    [SVProgressHUD showWithStatus:@"Connecting with Facebook"];
    if (! self.isFirstFBLoginDone) {
    #warning simple workaround, but not solving the source problem of twiced call from loginViewFetchedUserInfo
        if ([[SingletonClass sharedInstance] hasCredentials] == NO) {
            [self.swebapi registerUser:user];
        } else {
            [self toSurroundView];
        }

        self.isFirstFBLoginDone = TRUE;

    } // isFirstFBLoginDone
}
@end

最佳答案

一些可能导致您的代码出现问题的事情 --

  1. 设置 UIGestureRecognizer 的委托(delegate)以强制识别多个手势识别器,特别是同时识别这个新的手势识别器和 Facebook 登录按钮的手势识别器)使用:gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer

  2. 将您的 UIGestureRecognizercancelsTouchesInView 属性设置为 NO。

  3. 与其将指向 fbButton 的指针初始化为 UIView,不如将 fbButton 声明为 FBLoginView 并将 UIView 转换为 FBLoginView

  4. (最重要的是)当您应该将 UITapGestureRecognizer 添加到按钮时,您将其添加到 View 。

改变:

[self.view addGestureRecognizer:tapped];

到:

[fbButton addGestureRecognizer:tapped];

关于ios - 知道何时在 ios 中按下 facebook 登录按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22883536/

相关文章:

iphone - 自动注销iphone应用程序

ios - 如何在使用 PSPDFKIT (iOS) 和 Objective C 时突出显示文本

ios - 可以在 native FB 应用程序中运行自定义应用程序吗?

iphone - 如何在 IOS 中嵌入 Twitter feed 和/或主题标签

ios - sthttprequest 和 jsonkit 与 arm64,不再工作?

ios - 将 react-native-router-flux 与 redux 一起使用,如何更新 View 组件中的状态?

ios - 将 View 旋转 90 度 iOS

swift - FBSDKGraphRequestHandler Swift 3错误

javascript - ie8 中的 facebook api 问题

ios - 无法使用方法 swizzling 打印当前的 ViewController 名称