适用于iOS的Facebook SDK,fbDidLogin从未在多nib应用程序中调用

时间:2011-08-01 16:14:34

标签: ios facebook facebook-ios-sdk

这是我第一次发帖,因为我通常只是来研究问题,但这个我无法弄清楚自己。

基本上我的问题类似于使用facebook sdk for iOS的其他开发人员,即使我登录后也无法调用我的fbDidLogin函数,可以让我的帖子成功提供。我查看了其他帖子,例如fbDidLogin never called (facebook-ios-sdk)fbDidLogin not called,但我没有成功。我的应用程序有一个加载的主视图,按下按钮后它会拉入第二个笔尖并替换视图。第二个视图控制器在那里有facebook功能,我觉得我的问题可能是从Appdelegate连接到第二个ViewController。我在示例应用程序中注意到所有内容都在appdelegate中设置,但这不是我的程序运行的方式。

我是客观c编程的新手,但到目前为止,我已经很好地构建了一些应用程序,只是这个facebook sdk正在杀了我。

我很欣赏人们可以向我投掷任何方向。谢谢。

以下是一些代码:

- (void)login {
    facebook=[[Facebook alloc]initWithAppId:FB_APP_ID];
    NSLog(@"Inside login/post to wall function.");
    NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys:
                                       @"mystuff",@"test",
                                       @"mystuff", @"link",
                                       @"mystuff", @"picture",
                                       mystuff, @"name",
                                       @"mystuff", @"caption",
                                       @"mystuff", @"description",
                                       @"mystuff",  @"message",
                                       nil];
    [facebook dialog:@"feed" andParams:params andDelegate:self];
}

/**
 * Invalidate the access token and clear the cookie.
 */
- (void)logout {
    [facebook logout:self];
}

/**
 * Called when the user has logged in successfully.
 */
-(void)fbDidLogin{
    NSLog(@"Inside fbDidLogin function.");
}

/**
 * Called when the user canceled the authorization dialog.
 */
-(void)fbDidNotLogin:(BOOL)cancelled {
    NSLog(@"User did not login.");
}

1 个答案:

答案 0 :(得分:4)

这里的问题是,一旦授权过程完成,您的代理就不再存在了。我将创建一个实现FBSessionDelegate的类,并将其作为应用程序委托的属性。现在,当您连接委托时,将其设置为该属性。如果您愿意,也可以使用界面构建器进行连线。只需将委托设置为您在应用程序委托上定义的属性即可。

例如,您可以拥有一个执行以下操作的类(此代码涵盖了80% - 希望它能让您走上正确的轨道):

typedef void (^completionHandler)(id);

@interface FacebookController : NSObject <FBSessionDelegate>
{
    completionHandler handler;
}

- (void)postToWallWithOptions:(NSDictionary *)options;
- (void)login:(completionHandler)handler;
- (void)fbDidLogin;

实施将是:

@implementation FacebookController

- (void)postToWallWithOptions:(NSDictionary *)options
{
    completionHandler handler = ^(id data)
        {
    // If you want this class to also be the delegate dialog, it will need to implement FBDialogDelegate
            [facebook dialog:@"feed"
                   andParams:options
                 andDelegate:self];
        };
[self login:handler];
}

- (void)login:(completionHandler)handler
{
completionHandler = handler;
// Be sure to add in your permissions here
[facebook authorize:yourPermissions 
               delegate:self];
}

- (void)fbDidLogin
{
// You could pass any object you needed to here
completionHandler(nil);
}

@end

您需要将此类定义为应用程序委托的属性:

@property (nonatomic, retain) FacebookController *fbController;

现在,只要你需要你的FacebookController,你就可以这样做:

FacebookController *fbController = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] fbController];