如何在ViewController中使用Facebook实例?

时间:2012-05-30 13:14:48

标签: ios5 facebook-ios-sdk

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

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation; 永远不会被称为

2在AppDelegate中实例化Facebook实例,然后在ViewControllers中使用该实例 - 它不起作用,因为使用此代码(在此处找到:How do I persist a Facebook instance in multiple IOS view classes?

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

facebook是零。

哪种方式适合工作?

2 个答案:

答案 0 :(得分:0)

(如果您在收到更多反馈后给我,我会编辑我的答案。)

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

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation实施应该在你的app delegate

如果您只需要在一个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];
}

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

答案 1 :(得分: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中,你可以拥有一个你不会分配/ init的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;
}

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

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