2012-05-30 31 views
1

我遇到了開發與Facebook SDK集成的iOS 5應用程序的麻煩。 我的應用程序有很多ViewsController,對於他們每個人我都想使用不同的請求(當然)從Facebook獲取不同的數據。 目前我只能在AppDelegate上獲取數據(在官方教程之後),但我需要在視圖控制器中獲取數據。 我嘗試過2個選項: 1)每個視圖控制器 - 它實例化不同的Facebook實例dosent的工作,我不知道爲什麼,但似乎如何在ViewController中使用Facebook實例?

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation; 從未被稱爲

2實例化的Facebook例如在AppDelegate中,然後使用該實例中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

的Ciao!你在哪裏實現 - (BOOL)應用程序:(UIApplication *)應用程序openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation; ? – Moxy

+0

在視圖控制器中,因爲它需要訪問Facebook實例中的執行 – Giacomo

+0

看看我的答案,讓我知道如果你發現有什麼東西丟失 – Moxy

回答

0

(如果你給我更多的反饋意見後,我將編輯我的答案。)

我沒有用了很多Facebook的SDK,但我記得有這個問題時,我試過了。

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation實施應該在你的應用程序代理

如果您需要訪問自己的Facebook的實例就是一個的viewController(比方說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]; 
} 

如果實現文件你仍然有問題讓我知道!

+0

它爲我工作,謝謝! 如果我想在另一個ViewController中使用相同的Facebook實例,該怎麼辦? – Giacomo

+0

我發佈了另一個答案,展示瞭如何在您的應用中訪問相同的Facebook實例。我沒有測試過,所以讓我知道是否有什麼問題。 – Moxy

0

我不編輯我的答案,因爲這是我從未測試過的代碼。

如果你想使用同Facebook的情況下在不同的viewController這是做這件事:(我會用一個屬性)

正如你的問題已經提到

,你應該在的appDelegate初始化

MyAppDelegate.h:

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

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

MyAppDelegate。L:

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

然後在任何視圖控制器,你想你可以有一個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; 
} 

過程中的DIF和ferent ViewControllers您將使用應實行不同的SDK協議,根據您的需求

你應該看看被Facebook的示例項目,被稱爲Hackbook

相關問題