如何在Swift中创建FBOpenGraphAction?

时间:2015-03-01 16:00:18

标签: ios objective-c facebook swift

使用objective-c创建FBOpenGraphAction,如:

id<FBOpenGraphAction> action = (id<FBOpenGraphAction>)[FBGraphObject graphObject];

Swift中的等价物是什么?

我原以为它是这样的:

let action = FBGraphObject.graphObject() as FBOpenGraphAction

但这会在运行时产生信号。

另见FBOpenGraphAction runtime error in Swift

非常感谢任何想法。

3 个答案:

答案 0 :(得分:1)

好的,这是一个已知问题,你可以在下面找到答案。

简而言之,无法直接在SWIFT中创建操作,您必须通过Objective-C进行间接操作。

Facebook回答:https://developers.facebook.com/bugs/776452979070484/


对于链接不起作用或消失的情况,这里是FB开发人员答案的副本:

iOS SDK v3.x中的Open Graph API实现是鸭子类型,取决于C的弱类型。 Swift中的所有演员都是强类型的。因此,由于NSMutableDictionary和FBGraphObject没有正式符合FBOpenGraphObject,因此Swift转换失败。

您可以创建Objective-C API来执行演员表,例如id<FBOpenGraphObject> FBGraphObjectToFBOpenGraphObject(id<FBGraphObject> o) { return (id<FBOpenGraphObject>)o; },作为解决方法。


我已经完成了这项工作并且对我有用。

答案 1 :(得分:1)

好的,这是我昨天对@jeffjv问题的回答。

不,我不是要转换您发布的膳食样本。无论如何,我把它转换成了Swift。

这是swift代码,将其添加到任何swift文件中:

let mealObject = FBGraphObject.openGraphObjectForPostWithType("cooking-app:meal", title: "Lamb Vindaloo", image: "https://example.com/cooking-app/images/Lamb-Vindaloo.png", url: "https://example.com/cooking-app/meal/Lamb-Vindaloo.html", description: "Spicy curry of lamb and potatoes")

let bridge = FacebookBridge()
let cookAction = bridge.graphObject()

cookAction.setObject(mealObject, forKey: "meal")

FBDialogs.presentShareDialogWithOpenGraphAction(cookAction, actionType: "cooking-app:cook", previewPropertyName: "meal",  handler: { (call: FBAppCall!, result:[NSObject : AnyObject]!, error: NSError!) -> Void in

  if error != nil {
    println("Error: \(error.description)")
  } else {
    println("Success!")
  }

})

然后我创建了一个名为FacebookBridge.m的文件,如下所示:

#import <Foundation/Foundation.h>
#import <FacebookSDK/FBOpenGraphAction.h>

#import "FacebookBridge.h"

@implementation FacebookBridge

- (id<FBOpenGraphAction>) graphObject{
  return (id<FBOpenGraphAction>)[FBGraphObject graphObject];
}

@end

接下来,我创建了一个名为FacebookBridge.h的文件

#ifndef EventCalendar1_FacebookBridge_h
#define EventCalendar1_FacebookBridge_h

#import <Foundation/Foundation.h>

@interface FacebookBridge : NSObject

- (id<FBOpenGraphAction>) graphObject;

@end

#endif

最后,我将以下语句添加到我的bridging-header文件中,该文件名为YourProject-Bridging-Header.h(YourProject必须是项目的名称)。

#import "FacebookBridge.h"

基本上就是这样。您还必须在AppDelegate.swift文件中添加一些代码,但这在Facebook开发人员页面中已有很好的记录。

答案 2 :(得分:0)

我添加评论,但我没有代表。我稍后会删除它。

@Horowitzathome,你能不能包括你为实现这个目的所做的快速和客观的c内插器?我尝试了很多技巧而没有工作。我假设您正在尝试转换此示例,对吧?

id<FBGraphObject> mealObject =
    [FBGraphObject openGraphObjectForPostWithType:@"cooking-app:meal"
                                            title:@"Lamb Vindaloo"
                                            image:@"https://example.com/cooking-app/images/Lamb-Vindaloo.png"
                                              url:@"https://example.com/cooking-app/meal/Lamb-Vindaloo.html"
                                      description:@"Spicy curry of lamb and potatoes"];

id<FBOpenGraphAction> cookAction = (id<FBOpenGraphAction>)[FBGraphObject graphObject];
[cookAction setObject:mealObject forKey:@"meal"];

[FBDialogs presentShareDialogWithOpenGraphAction:cookAction
                                      actionType:@"cooking-app:cook"
                             previewPropertyName:@"meal"
                                         handler:^(FBAppCall *call, NSDictionary *results, NSError *error) {
    if(error) {
        NSLog(@"Error: %@", error.description);
    } else {
        NSLog(@"Success!");
    }
}];