目标Sharpie有时会将我添加到@protocols

时间:2016-10-27 09:27:37

标签: xamarin xamarin.ios objective-sharpie xamarin-binding

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

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

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

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

为什么Objective Sharpie在继承接口列表中添加I,但在接口名称本身中没有?

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

1 个答案:

答案 0 :(得分:2)

  

从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