2012-03-29 62 views
1

我已经阅读了许多关于Facebook登录的问题,但是直到我没有成功解决我的问题。到目前为止,我已经做了几个应用程序,但我从来没有与appDelegate搞混了。facebook fbDidLogin outside appdelegate

问题是,我想调用fbDidLogin方法,这是我的班级以外的委托。

到目前为止,fbDidLogin正在appDelegate中调用,但我希望能够在登录发生后更改视图并询问用户信息。

到目前为止我的代码: 的AppDelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window.rootViewController = self.tabBarController; 
    [self.window makeKeyAndVisible]; 

    facebook = [[Facebook alloc] initWithAppId:SHKCONFIG(facebookAppId) andDelegate:self]; 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    if ([defaults objectForKey:@"FBAccessTokenKey"] 
     && [defaults objectForKey:@"FBExpirationDateKey"]) { 
     facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"]; 
     facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"]; 
    } 

    return YES; 
} 

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{ 
    return [facebook handleOpenURL:url]; 
} 

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url 
{ 
    return [facebook handleOpenURL:url]; 
} 

// This one is called correctly 
- (void)fbDidLogin { 
    NSLog(@"[DELEGATE] Deu login!"); 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"]; 
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"]; 
    [defaults synchronize]; 
} 

我自己的类与Facebook的登录按钮:

- (void)loginFacebook { 

    if (![facebook isSessionValid]) { 
     NSLog(@"[LOGIN] Facebook session invalid"); 
     NSArray * permissions = [[NSArray alloc] initWithObjects: 
           @"email", 
           @"user_birthday", 
           nil]; 
     [facebook authorize:permissions]; 
     [permissions release]; 
    } else { 
     NSLog(@"[LOGIN] Facebook session valid"); 
     [facebook requestWithGraphPath:@"me" andDelegate:self]; 
    } 
} 
// I want this one to work so I can ask for user info at the end of it 
- (void)fbDidLogin { 
    NSLog(@"[LOGIN][FB] Deu login!"); 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"]; 
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"]; 
    [defaults synchronize]; 
    [facebook requestWithGraphPath:@"me" andDelegate:self]; 
} 

我抱歉如果这是不明确的,如果你需要更多的信息,让我知道。

回答

5

您可以发布在App代表的通知,像这样:

- (void)fbDidLogin { 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"FBDidLoginCalled" object:nil]; 
} 

,然后在其他类:

- (void)loginFacebook { 

    if (![facebook isSessionValid]) { 
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(fbDidLoginNotificationFired) name:@"FBDidLoginCalled" object:nil] 
     NSLog(@"[LOGIN] Facebook session invalid"); 
     NSArray * permissions = [[NSArray alloc] initWithObjects: 
          @"email", 
          @"user_birthday", 
          nil]; 
     [facebook authorize:permissions]; 
     [permissions release]; 
    } else { 
     NSLog(@"[LOGIN] Facebook session valid"); 
     [facebook requestWithGraphPath:@"me" andDelegate:self]; 
    } 
} 
// I want this one to work so I can ask for user info at the end of it 
- (void)fbDidLoginNotificationFired { 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"FBDidLoginCalled" object:nil]; 

    NSLog(@"[LOGIN][FB] Deu login!"); 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"]; 
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"]; 
    [defaults synchronize]; 
    [facebook requestWithGraphPath:@"me" andDelegate:self]; 
} 
+0

太棒了...好主意.. !! – 2012-05-17 02:36:38

-1

我加入的-loginFacebook这个代码管理它:

myIphoneAppDelegate * MyAppDelegate = (myIphoneAppDelegate*)[[UIApplication sharedApplication] delegate]; 
MyAppDelegate.loginController = self; 

然后在我的appDelegate上创建了我的登录控制器的属性,然后调用co ntrollers -fbDLogLogin:

- (void)fbDidLogin { 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"]; 
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"]; 
    [defaults synchronize]; 
    [self.loginController fbDidLogin]; 
} 
+0

为什么这会被拒绝? – Jimmy 2012-06-11 14:52:32