2012-03-29 63 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