我在使用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是零。
哪种方式适合工作?
答案 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