1

我在开发带有 Facebook SDK 集成的 iOS 5 应用程序时遇到了麻烦。我的应用程序有许多 ViewsController,对于每个 ViewsController,我想使用不同的请求从 Facebook 获取不同的数据(当然)。目前我只能在 AppDelegate 上获取数据(按照官方教程),但我需要在视图控制器中获取数据。我尝试了 2 个选项:1)在每个 ViewController 上实例化不同的 Facebook 实例 - 它不起作用,我不知道为什么,但似乎

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation; 从未被调用

2 在 AppDelegate 中实例化 Facebook 实例,然后在 ViewControllers 中使用该实例 - 它不起作用,因为使用此代码(在此处找到:如何在多个 IOS 视图类中持久化 Facebook 实例?

- (void)viewDidLoad
{
    [super viewDidLoad];
    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    Facebook *facebook = [appDelegate facebook];
}

脸书是零。

哪种工作方式才是正确的?

4

2 回答 2

0

(如果您在此之后给我更多反馈,我将编辑我的答案。)

我没有大量使用 Facebook SDK,但我记得我尝试过时遇到了这个问题。

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation实现应该在您的应用委托中

如果您只需要在一个 viewController 中访问您的 Facebook 实例(比如说 MyFacebooViewController)

你可以有这样的东西

#import <UIKit/UIKit.h>
#import "FBConnect.h"

@interface MyFacebookViewController : UIViewController <FBSessonDelegate, FBRequestDelegate>
@property (nonatomic, strong) Facebook *facebook;
...
@end

你的 .m 文件应该包含这个

#import "MyFacebookViewController.h"
#import "MyAppDelegate.h"

@implementation MyFacebookViewController

@synthesize facebook = _facebook;

-(Facebook *)facebook
{
    if(!_facebook){
        _facebook = [[Facebook alloc] initWithAppId:MY_APP_ID andDelegate:self];
    }
    return _facebook;
}

-(void)viewDidLoad
{
    [super viewDidLoad];
    ((MyAppDelegate *)([[UIApplication sharedApplication] delegate])).facebookViewController = self;
    ...
}

当然你需要实现你的 FBSessionDelegate 和 FBRequestDelegate 方法

在 AppDelegate 中:

#import <UIKit/UIKit.h>
#import "MyFacebookViewController.h"

@interface MyAppDelegate : UIResponder <UIApplicationDelegate>
...
@property (strong, nonatomic) MyFacebookConnectViewController *facebookViewController;
@end

您需要在实现文件中放置- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

@implementation MyAppDelegate

@synthesize facebookViewController = _facebookViewController;
...

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

如果您仍然有问题,请告诉我!

于 2012-05-31T12:57:53.547 回答
0

我没有编辑我的答案,因为这是我从未测试过的代码。

如果您想在不同的 viewController 中使用相同的 Facebook 实例,这是一种方法:

正如您的问题中已经提到的,您应该在 appDelegate 中对其进行初始化(我会使用一个属性。)

MyAppDelegate.h:

#import <UIKit/UIKit.h>
#import "FBConnect.h"

@interface MyAppDelegate : UIResponder <UIApplicationDelegate>
...
@property (strong, nonatomic) Facebook *facebook;
@end

MyAppDelegate.m:

#import "MyAppDelegate.h"

@implementation MyAppDelegate

@synthesize facebook = _facebook;

-(Facebook *)facebook
{
    if(!_facebook){
        _facebook = [Facebook alloc] initWithAppId:MY_APP_ID andDelegate:self];
    }
    return _facebook;
}

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

然后在任何你想要的 ViewController 中,你可以有一个 Facebook 属性,你不会分配/初始化,但你会以这种方式从 appDelegate 询问它

AnyViewController.h:

#import "MyAppDelegate.h"

@interface AnyViewController : UIViewController
...
@property (strong, nonatomic) Facebook *facebook;
@end

AnyViewController.m :

#import "AnyViewController.h"

@implementation AnyViewController

@synthesize facebook = _facebook;

-(Facebook *)facebook
{
    if(!_facebook){
        MyAppDelegate *theAppDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
        _facebook = theAppDelegate.facebook;
    }
    return _facebook;
}

当然,您将使用的不同 ViewController 应根据您的需要实现不同的 SDK 协议

你应该看看 Facebook 的名为Hackbook的示例项目

于 2012-06-01T18:50:36.647 回答