2012-05-30 3 views
1

У меня возникли проблемы с разработкой приложения iOS 5 с интеграцией с SDK для Facebook. В моем приложении много ViewsController, и для каждого из них я хочу получить разные данные из Facebook, используя разные запросы (конечно). На данный момент я могу получить данные только на AppDelegate (после официального учебника), но мне нужно получить данные в контроллере представления. Я попробовал 2 вариант: 1) Instantiate различных экземпляров Facebook на каждом ViewController -IT доцент»работу, я не знаю, почему, но мне кажется, чтоКак использовать экземпляр Facebook в ViewController?

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation; никогда не называют

-инстанцировать 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 sourceПриложение: (NSString *) sourceApplication аннотация: (id) аннотация; ? – Moxy

+0

В viewcontroller, потому что ему нужно получить доступ к экземпляру Facebook в реализации – Giacomo

+0

Посмотрите на мой ответ, дайте мне знать, если вы обнаружите, что чего-то не хватает – Moxy

ответ

0

(я буду редактировать свой ответ, если вы дадите мне после этого больше отзывов.)

Я не использовал много Фейсбук 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]; 
} 

If у вас все еще есть проблемы, дайте мне знать!

+0

Это сработало для меня, спасибо! Что делать, если я хочу использовать тот же экземпляр Facebook в другом ViewController? – 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.м:

#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, что вы бы не Alloc/инициализация, но вы спросите его от 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

Смежные вопросы