2

如何在作为“实现协议的类型”的 Objective-c 参数的 MonoTouch 绑定中定义参数/返回类型,例如“ 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?

4

1 回答 1

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在这种情况下我们不必这样做。

希望这可以帮助

亚历克斯

于 2013-06-02T16:01:15.323 回答