在 ios xcode 4.3(故事板)中弹出 facebook feed 对话框(用于墙贴)
Posted
技术标签:
【中文标题】在 ios xcode 4.3(故事板)中弹出 facebook feed 对话框(用于墙贴)【英文标题】:popup facebook feed dialog (for wall posting) in ios xcode 4.3 (storyboard) 【发布时间】:2012-04-04 12:50:20 【问题描述】:我正在制作一个需要集成 facebook 分享(提要)对话框的应用程序。我阅读了https://developers.facebook.com/docs/mobile/ios/build/ 上的所有内容,并且当应用程序完成启动时,我能够加载 facebook 分享(提要)对话框。但我的问题是我使用的是 xcode 4.3,即故事板,我想在按钮操作上加载 facebook 提要对话框。
我制作了另一个视图控制器并粘贴了 AppDelegate 函数的所有内容
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
在其-(void) viewDidload
中并能够加载“登录页面”,然后是我的“Facebook 应用”页面。
之后,当我允许我的 Facebook 应用程序获得许可时,它不会显示“提要对话框”
这是我的 viewController.h 文件
#import "FBConnect.h"
@interface ViewController : UIViewController<FBSessionDelegate,FBDialogDelegate>
Facebook *facebook;
@property (nonatomic, retain) Facebook *facebook;
@end
-这是我的 ViewController.m 文件
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
@synthesize facebook=_facebook;
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
facebook = [[Facebook alloc] initWithAppId:@"284727404938450" andDelegate:self];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults objectForKey:@"FBAccessTokenKey"]
&& [defaults objectForKey:@"FBExpirationDateKey"])
facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
if (![facebook isSessionValid])
[facebook authorize:nil];
- (void)fbDidLogin
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
[defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
[defaults synchronize];
[facebook dialog:@"feed" andDelegate:self];
但这里有两种方法在 AppDelegate 文件中使用
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
return [ facebook] handleOpenURL:url];
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
return [ facebook] handleOpenURL:url];
我知道在xib中这些方法应该是:
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
return [[_ViewController facebook] handleOpenURL:url];
// For iOS 4.2+ support
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
return [[_ViewController facebook] handleOpenURL:url];
这些方法负责为当前的“facebook”实例(Facebook *facebook)弹出一个提要对话框。
我的问题是在情节提要中我们没有“窗口”和视图控制器实例,所以我的猜测是我当前的视图控制器的“facebook”实例没有调用这两种方法。我如何为我的“facebook”实例调用这两个函数,其中我的 viewController 不是 AppDelegate 文件的实例?
请帮帮我。
【问题讨论】:
【参考方案1】:在使用 Facebook(或调用这些委托函数)之前,您可以在应用委托的 _viewcontroller 中传递您的视图控制器的引用。
您的视图控制器的 viewdidload() 将如下所示:
-(void)viewDidLoad
[[UIApplication sharedApplication] delegate]._viewComtroller = self; // pass reference to the appdalegate
// Other code (or call the facebook function here)
它会工作
【讨论】:
【参考方案2】:要小心,因为您正在定义一个名为“facebook”的 ivar 和一个名为“facebook”的属性,该属性会创建另一个名为“_facebook”的 ivar。然后在您的代码中,您正在使用 ivar“facebook”,因此当您调用 [_ViewController facebook]
时,您访问的是属性 (ivar _facebook),而不是您初始化的 ivar“facebook”。
我认为这不是您要寻找的答案,但指出这一点似乎很重要。
祝你好运!
【讨论】:
【参考方案3】:看起来您缺少一些与 Facebook 相关的委托,并且您没有按照在线教程的指示将它们全部放入您的主应用委托中:
见https://developers.facebook.com/docs/mobile/ios/build/
【讨论】:
【参考方案4】:一种解决方案可以在 AppDelegate 中实现 Facebook 委托方法,然后在 viewController 中的 viewDidLoad 方法或您喜欢的方法中使用
AppDelegate *appDelegate= (AppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate.facebook authorize:permissions];
其中权限是具有您需要的权限的数组。应该可以的,方法
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
return [ facebook] handleOpenURL:url];
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
return [ facebook] handleOpenURL:url];
执行。
【讨论】:
以上是关于在 ios xcode 4.3(故事板)中弹出 facebook feed 对话框(用于墙贴)的主要内容,如果未能解决你的问题,请参考以下文章
Facebook iOS sdk xcode 4.3/storyboards
Xcode 4.3 如何使用 SVN 合并来自两个开发人员的故事板更改?