Delphi + iOS:如何声明简单的ObjC类?

4
我该如何在Delphi/Firemonkey(XE5或XE6)中声明一个简单的ObjC类?我想创建一个动画代理类,并在这个类中添加一些代理方法。
谢谢!
2个回答

4
创建一个接口并包含你的方法,并从IObjectiveC继承。同时,创建一个GUID(全局唯一标识符)。我不会在这里贴出我的GUID,以免有人尝试使用它。
  ISampleDelegate = interface(IObjectiveC)
    ['{put-your-own-guid-here}'] // <-- Press Ctrl+Shift+G to create your own guid - must be unique for every interface
    procedure DispatchItem(Sender: Pointer); cdecl;
  end;

创建您的委托实现并继承 TOCLocal。它应该实现您的委托接口。
  TSampleDelegate = class(TOCLocal, ISampleDelegate)
  private
    FOwner: TMenuItem;
  public
    constructor Create(AOwner: TMenuItem);
    procedure DispatchItem(Sender: Pointer); cdecl;
  end;

constructor TSampleDelegate.Create(AOwner: TMenuItem);
begin
  inherited Create;
  FOwner := AOwner;
end;

创建委托:
FDelegate: ISampleDelegate;

FDelegate := TSampleDelegate.Create(Self);

指定您的代表:

Item.setDelegate(FDelegate);

释放你的委托:

Item.setDelegate(nil);
TNSObject.Wrap((FDelegate as ILocalObject).GetObjectID).release; // don't forget this one! The create constructor calls Alloc in inherited
FDelegate := nil;

0
我想补充Sebastian Z的回答(但我还不能评论),并且只是说实现委托接口的类中的方法应该声明为public(就像Sebastian所做的那样)。要么这样,要么确保适当的RTTI信息暴露给方法,否则在创建对象时会引发一个带有消息“Method ... not found”的EObjectiveC异常。
编辑:我相当确定Sebastian Z的回答中的Item.setDelegate(FDelegate);是错误的,必须使用GetObjectID来获取指向委托对象的指针。在我进行更改之前,我一直遇到访问冲突问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接