1

我正在制作一个应用程序,我需要在其中集成一个 facebook 共享(提要)对话框。我在https://developers.facebook.com/docs/mobile/ios/build/上阅读了所有内容,并且在应用程序完成启动后,我能够加载 facebook 共享(提要)对话框。但我的问题是我使用的是 xcode 4.3 即故事板,我想在按钮操作上加载 facebook 提要对话框。

我制作了另一个视图控制器并粘贴了 AppDelegate 函数的所有内容 (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

在其中-(void) viewDidload并能够加载“登录页面”,然后是我的“Facebook 应用程序”页面。

之后,当我允许我的 Facebook 应用程序获得许可时,它不会显示“提要对话框”

这是我的 viewController.h 文件

 #import "FBConnect.h"

@interface ViewController : UIViewController<FBSessionDelegate,FBDialogDelegate>
{
    Facebook *facebook;
}
@property (nonatomic, retain) Facebook *facebook;

@end

- 这是我的 ViewController.m 文件

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize facebook=_facebook;
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    facebook = [[Facebook alloc] initWithAppId:@"284727404938450" andDelegate:self];

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    if ([defaults objectForKey:@"FBAccessTokenKey"] 
        && [defaults objectForKey:@"FBExpirationDateKey"]) {
        facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
        facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
    }

    if (![facebook isSessionValid]) {
        [facebook authorize:nil];
    }        
}    

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

    [facebook dialog:@"feed" andDelegate:self];    
}

但这里有两种在 AppDelegate 文件中使用的方法

- (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]; 
}

我知道在 xib 中这些方法应该是:

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

// For iOS 4.2+ support
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    return [[_ViewController facebook] handleOpenURL:url]; 
}

这些方法负责为当前的“facebook”实例(Facebook *facebook)弹出一个提要对话框。

我的问题是在情节提要中我们没有“窗口”和视图控制器实例,所以我的猜测是我当前的视图控制器的“facebook”实例没有调用这两种方法。如何为我的“facebook”实例调用这两个函数,其中我的 viewController 不是 AppDelegate 文件的实例?

请帮帮我。

4

4 回答 4

0

请小心,因为您正在定义一个名为“facebook”的 ivar 和一个名为“facebook”的属性,该属性会创建另一个名为“_facebook”的 ivar。然后在您的代码上,您正在使用 ivar“facebook”,因此当您调用时,[_ViewController facebook]您正在访问属性 (ivar _facebook),而不是您初始化的 ivar“facebook”。

我认为这不是您正在寻找的答案,但指出这一点似乎很重要。

祝你好运!

于 2012-04-04T13:03:13.857 回答
0

看起来您缺少一些与 Facebook 相关的代表,并且您没有按照在线教程的指示将它们全部放在您的主应用程序代表中:

请参阅https://developers.facebook.com/docs/mobile/ios/build/

于 2012-04-04T13:56:23.347 回答
0

一种解决方案可以在 AppDelegate 中实现 Facebook 委托方法,然后在 viewController 中的 viewDidLoad 方法或您喜欢的方法中使用

AppDelegate *appDelegate= (AppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate.facebook authorize:permissions];

其中权限是具有您需要的权限的数组。那应该工作和方法

- (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]; 
 }

执行。

于 2012-04-04T15:36:36.167 回答
0

在使用 Facebook(或调用这些委托函数)之前,您可以在应用程序委托的 _viewcontroller 中传递您的视图控制器的引用。

您的视图控制器的 viewdidload() 将如下所示:

-(void)viewDidLoad{ 



[[UIApplication sharedApplication] delegate]._viewComtroller = self; // pass reference to the appdalegate



//   Other code (or call the facebook function here) 

}

它会工作

于 2014-01-11T19:25:45.403 回答