3

我正在尝试绑定一个库,我遇到了这个问题:

// @interface PTPusher : NSObject <PTPusherConnectionDelegate, PTPusherEventBindings>
[BaseType(typeof(NSObject))]
interface PTPusher : IPTPusherConnectionDelegate, IPTPusherEventBindings

和找不到,但它们未更改的名称确实存在IPTPusherConnectionDelegateIPTPusherEventBindings

// @protocol PTPusherConnectionDelegate <NSObject>
[Protocol, Model]
[BaseType(typeof(NSObject))]
interface PTPusherConnectionDelegate

为什么Objective SharpieI在继承的接口列表中添加了,而不是在接口名称本身中?

我应该改变什么来解决这个问题?我是在接口名称中添加 I 还是从继承的接口列表中删除 I?或者我可以在不更改这些内容的情况下解决这个问题,只需向这些类/接口添加或删除属性?

4

1 回答 1

3

从 MonoTouch 7.0 开始,加入了新的改进的协议绑定功能。任何包含 [Protocol] 属性的定义实际上都会生成三个支持类,它们极大地改进了您使用协议的方式:

// Full method implementation, contains all methods
class MyProtocol : IMyProtocol {
    public void Say (string msg);
    public void Listen (string msg);
}

// Interface that contains only the required methods
interface IMyProtocol: INativeObject, IDisposable {
    [Export ("say:”)]
    void Say (string msg);
}

// Extension methods
static class IMyProtocol_Extensions {
    public static void Optional (this IMyProtocol this, string msg);
    }
}

还,

如果要在 API 中使用协议定义,则需要在 API 定义中编写骨架空接口。如果你想在 API 中使用 MyProtocol,你需要这样做:

[BaseType (typeof (NSObject))]
[Model, Protocol]
interface MyProtocol {
    // Use [Abstract] when the method is defined in the @required section
    // of the protocol definition in Objective-C
    [Abstract]
    [Export ("say:")]
    void Say (string msg);

    [Export ("listen")]
    void Listen ();
}

interface IMyProtocol {}

[BaseType (typeof(NSObject))]
interface MyTool {
    [Export ("getProtocol")]
    IMyProtocol GetProtocol ();
}

来源:https ://developer.xamarin.com/guides/cross-platform/macios/binding/binding-types-reference/#Protocols

于 2016-10-27T10:04:04.790 回答