1

Facebook SDK を統合した iOS 5 アプリの開発に問題があります。私のアプリには多くの ViewsController があり、それぞれについて、さまざまなリクエストを使用して Facebook からさまざまなデータを取得したいと考えています (もちろん)。現時点では、(公式チュートリアルに従って) AppDelegate でのみデータを取得できますが、View Controller でデータを取得する必要があります。私は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];
}

フェイスブックはゼロです。

正しい働き方は?

4

2 に答える 2

0

(その後、フィードバックをいただければ、回答を編集します。)

Facebook SDKはあまり使用していませんが、試したときにその問題が発生したことを覚えています。

実装は- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotationアプリデリゲートにある必要があります

1つのviewController(たとえばMyFacebooViewController)でFacebookインスタンスにアクセスする必要がある場合

あなたはこのようなものを持つことができます

#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インスタンスを使用したい場合、これはそれを行う1つの方法です:

質問ですでに述べたように、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 プロトコルを実装する必要があります。

Hackbookと呼ばれる Facebook のサンプル プロジェクトをご覧ください。

于 2012-06-01T18:50:36.647 に答える