如何实现x:y命名的委托方法?

时间:2014-10-17 15:54:26

标签: macos cocoa delphi webview delegates

我想在Delphi中为这个obj-c方法创建一个WebView的WebFrameLoadDelegate方法:

- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame

如何在delphi中声明此方法?

这些不能工作:

public
    procedure didFinishLoadForm( webView:WebView; Sender:WebFrame ); cdecl;
    procedure webViewdidFinishLoadForm( webView:WebView; Sender:WebFrame ); cdecl;

设置委托类似乎没问题    webview.setFrameLoadDelegate(d.GetObjectID);

其中d是TMyWebViewDelegate(TOCObject)类,GetObjectiveClass被覆盖,返回一个接口(NSObject),就像这里的工具栏委托一样http://delphihaven.wordpress.com/2012/07/15/using-the-cocoa-toolbar-nstoolbar-in-xe2/

但我的方法没有被调用。 声明这种obj-c方法的模式是什么?

2 个答案:

答案 0 :(得分:5)

通常最好使用方法和参数的确切名称(由Rudy回答)。但有时这是不可能的。两个函数可能需要具有相同的名称,但具有相同的参数类型,因此无法使用overload。在这种情况下,您可以使用MethodName属性。所以这是另一个有效的解决方案:

[MethodName('webView:didFinishLoadForFrame:')]
procedure webViewdidFinishLoadForm( Sender:WebView; Frame:WebFrame ); cdecl;

答案 1 :(得分:3)

实现例程的正确语法是:

procedure webView(sender: WebView; didFinishLoadForFrame: WebFrame);

Objective-C选择器的名称是webView:didFinishLoadForFrame:。第一部分必须成为方法的精确名称,以下部分必须成为参数的精确名称(区分大小写,因为Objective-C区分大小写)。这就是Delphi如何将方法名称映射到选择器。