I want to show a HUD when somebody press the facebook login button. Currently I struggle to know when the button was pressed.
I tried to grab all taps of the view, but this does not work for any reson on the facebook button...
How can know when the facebook login is pressed, to call my HUD?
Additional it would be nice to know which function the facebook login button triggers. Could not find out..
Code to grab taps, in LoginViewController.m (UPDATED, working solution)
// 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");
}
Debugger log
[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
Below the complete code:
LoginViewController.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
LoginViewController.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