MonoTouch绑定类型<implementationprotocol> </implementationprotocol>

时间:2013-06-02 06:02:57

标签: c# binding xamarin.ios

如何在Objective-c参数的MonoTouch Bindings中定义参数/返回类型,这些参数是“实现协议的类型”,例如“UIView<NIRecyclableView>”。

例如,检查此头文件。

https://github.com/jverkoey/nimbus/blob/master/src/core/src/NIViewRecycler.h

@interface NIViewRecycler : NSObject
- (UIView<NIRecyclableView> *)dequeueReusableViewWithIdentifier:(NSString *)reuseIdentifier;
- (void)recycleView:(UIView<NIRecyclableView> *)view;
- (void)removeAllViews;
@end

我应该将参数声明为IntPtr吗?如果是这样,我如何将MonoTouch实例转换为IntPtr?

1 个答案:

答案 0 :(得分:1)

在同一个头文件中,您有一个NIRecyclableView类,它继承自UIView并实现NIRecyclableView协议,因此您可能希望返回该对象

@interface NIRecyclableView : UIView <NIRecyclableView>

// Designated initializer.
- (id)initWithReuseIdentifier:(NSString *)reuseIdentifier;

@property (nonatomic, readwrite, copy) NSString* reuseIdentifier;

@end

因此该标头的绑定看起来像这样

[BaseType (typeof (NSObject))]
interface NIViewRecycler {
    [Export ("dequeueReusableViewWithIdentifier:")]
    NIRecyclableView DequeueReusableView (string reuseIdentifier);

    [Export ("recycleView:")]
    void RecycleView (NIRecyclableView view);

    [Export ("removeAllViews")]
    void RemoveAllViews ();
}

[Model]
[Protocol]
[BaseType (typeof (NSObject), Name = "NIRecyclableView")]
interface NIRecyclableViewProtocol {
    [Export ("reuseIdentifier", ArgumentSemantic.Copy)]
    string ReuseIdentifier { get; set; }

    [Export ("prepareForReuse")]
    void PrepareForReuse ();
}

// Here you would do interface NIRecyclableView : NIRecyclableViewProtocol
// But NIRecyclableView already implements reuseIdentifier
// So you just inline the missing method PrepareForReuse
// and you get the same results
[BaseType (typeof (UIView))]
interface NIRecyclableView {
    [Export ("initWithReuseIdentifier:")]
    IntPtr Contructor (string reuseIdentifier);

    [Export ("reuseIdentifier", ArgumentSemantic.Copy)]
    string ReuseIdentifier { get; set; }

    [Export ("prepareForReuse")]
    void PrepareForReuse ();
}

协议就像嘿,如果你愿意,这个对象也可以响应这个objective-c消息,所以你可以像我们上面那样在接口定义上手动内联它们,或NIRecyclableView : NIRecyclableViewProtocol在这种情况下我们不要不得不。

希望这有帮助

亚历