【问题标题】:How do I persist a Facebook instance in multiple IOS view classes?如何在多个 IOS 视图类中保留 Facebook 实例?
【发布时间】:2011-03-28 04:57:42
【问题描述】:

我已经阅读 Stack Overflow 有一段时间了,期待参与!关于问题...

我已经编程了大约 10 年,但对 iOS 编程和 Objective-C 是全新的。

我正在尝试构建一个需要 Facebook 登录的应用程序。当应用程序打开时,它需要加载一个带有徽标和 Facebook 登录按钮的视图。我可以做到这一点,让它毫无问题地工作。在他们使用 Facebook 登录后,我的应用程序将向我的服务器发送一个 API 调用,并通过我的系统对他们进行身份验证,并用他们的系统权限发回一个回调。如果返回他们具有正确的前进权限,他们将被发送到带有选项卡式界面的视图。我也有选项卡式界面工作。

我制作了一个 FirstViewController 来处理 Facebook 登录按钮,并为每个选项卡设置了视图控制器。

在 MyAppDelegate.m 文件中会存在如下内容:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    //init facebook & send initial view with login button
    facebook = [[Facebook alloc] initWithAppId:@"MYAPPID"];
    [self.window addSubview:FirstViewController.view];
    [self.window makeKeyAndVisible];

    //Code to check permissions from webserver
    if (permissions && _isLoggedIn) {
    // Add the tab bar controller's view to the window and display.
    [self.window addSubview:tabBarController.view];
    [self.window makeKeyAndVisible];
    }
    else //access denied view
    return YES;
}

现在,我需要调用 FirstViewController 中的 Facebook 登录方法...

[facebook authorize:nil delegate:self];

1) 如何在 MyAppDelegate 中访问 Facebook 实例? (我还需要能够从所有其他视图访问。)我是否创建一个委托/协议以从 MyAppDelegate 访问它?

2) 我这样做是不是非常愚蠢?如果是这样,请帮助业余 iOS 程序员走上正确的道路。

3) 如何很好地利用 Facebook 方法中的“delegate:”参数?我不确定我是否理解得很好。

谢谢, 马特

【问题讨论】:

    标签: iphone objective-c facebook sdk protocols


    【解决方案1】:

    我从未使用过 Facebook Objective-C API,但我可以让您深入了解如何设置对 Facebook 实例的全局访问。您可以像这样访问应用委托:

    MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
    

    只要你有访问MyAppDelegatefacebook ivar/property 的公共方法,你就可以像这样访问它:

    Facebook *theFacebook = [appDelegate facebook];
    

    只要你在某个地方#import "MyAppDelegate.h",这不会给你任何警告。

    至于-authorize:delegate:,请看Facebook.h。您传递给该方法的委托对象应实现FBSessionDelegate 协议。

    有关一般委派的更多信息,请查看Apple's documentation on the subject

    编辑

    在这里要明确地说,这是您应该在 MyAppDelegate.h 文件中输入的内容:

    // MyAppDelegate.h
    
    #import <UIKit/UIKit.h>
    
    @class Facebook;
    
    @interface MyAppDelegate : NSObject {
        UIWindow *window;
        UITabBarController *tabBarController;
        Facebook *facebook;
    }
    
    @property (nonatomic, retain) IBOutlet UIWindow *window;
    @property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
    @property (nonatomic, retain) Facebook *facebook;
    
    @end
    

    还有MyAppDelegate.m

    // MyAppDelegate.m
    
    #import "MyAppDelegate.h"
    #import "Facebook.h"
    
    @implementation MyAppDelegate
    
    @synthesize window;
    @synthesize tabBarController;
    @synthesize facebook;
    
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        /*...your implementation here...*/
    }
    
    /*...more methods...*/
    
    @end
    

    【讨论】:

    • 关于我第一个问题的答案......我只是无法让它工作。我在“[appDelegate facebook];”行收到错误“没有找到'-facebook'方法”我很困惑为什么它不起作用。
    • 您需要将-facebook 方法添加到您的应用委托类的头文件中,并在您访问Facebook 实例的任何位置包含该头文件。
    • 我拥有您发布的所有内容。我的问题是循环依赖。我在我的#import 之前扔了@class,结果很好。我现在在正确加载 NIB 文件时遇到问题,但至少我可以访问 MyAppDelegate 中的 Facebook 对象。谢谢。
    猜你喜欢
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多