2012-03-29 4 views
1

Facebookのログインについて多くの質問を読んだことがありますが、私が問題を解決することができなくなるまで、これまでにいくつかのアプリを作ったことがありますが、以前はappDelegateを使いこなしたことはありません。facebook fbDidLogin outside appdelegate

私は、代理人以外のクラスの中にあるfbDidLoginメソッドを呼び出す必要があります。

これまでは、appDelegateでfbDidLoginが呼び出されていましたが、ログインが行われた後で、ビューを変更してユーザー情報を要求できるようにしたいと考えています。

私のコード今のところ: 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]; 
} 

私は申し訳ありませんが、これは明確でない場合は、より多くの情報が必要な場合は、私に聞かせて知っている。あなたの他のクラスの

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

そして:

答えて

5

あなたがそうのようなアプリケーションの委任からの通知を投稿することができます

- (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

恐ろしくいいですね。 –

-1

を私は-loginFacebookにこのコードを追加することで、それを管理する:

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

次に、私のappDelegateで私のログインコントローラのプロパティを作成し、 ntrollers -fbDidLogin:

- (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