C# 单触式装订类型<;实施协议>;

C# 单触式装订类型<;实施协议>;,c#,binding,xamarin.ios,C#,Binding,Xamarin.ios,如何在Objective-c参数的MonoTouch绑定中定义参数/返回类型,这些参数是“实现协议的类型”,例如“UIView” 例如,检查此头文件 @interface NIViewRecycler:NSObject -(UIView*)带标识符的dequeueReusableViewWithIdentifier:(NSString*)reuseIdentifier; -(void)recycleView:(UIView*)视图; -(无效)删除所有视图; @结束 我应该将参数声明为Int

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

例如,检查此头文件

@interface NIViewRecycler:NSObject
-(UIView*)带标识符的dequeueReusableViewWithIdentifier:(NSString*)reuseIdentifier;
-(void)recycleView:(UIView*)视图;
-(无效)删除所有视图;
@结束

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

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

@interface NIRecyclableView : UIView <NIRecyclableView>

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

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

@end
协议就像hey,如果您愿意,这个对象也可以响应这个objective-c消息,因此您可以像上面那样在接口定义中手动内联它们,或者
NIRecyclableView:NIRecyclableViewProtocol
,在这种情况下,我们不必这样做

希望这有帮助


Alex

我理解这一点,然而,Nimbus坚持创建那些简单的类,以便用户轻松实现。在整个(几乎?)框架中,它们使用用户协议而不是基类来实现灵活性。如果使用协议NIRecyclableView从UIView继承的“SampleClass”可以绑定为从超类“NIRecyclableView”继承的“SampleClass”,那么这将是可行的。这是可能的吗?您必须自己实现协议,让我们假设您通过一个小的修改绑定了protcol,就像我上面所做的那样
UIView-DequeueReusableView(string-reuseIdentifier)
而不是
nirecycableview DequeueReusableView(字符串reuseIdentifier)
,现在您将有一个名为
NIRecyclableViewProtocol
的c类型,现在让我们假设您创建了自己的
UIView
类,名为
MyOwnUIView:UIView
,您想要
MyOwnUIView
实现
PrepareForReuse()
方法,您需要执行
MyOwnUIView:UIView,NiRecycableViewProtocol
,您可以在classimplementation上覆盖
PrepareForReuse()
,这样您就可以将自己的逻辑添加到实现中,因此,现在当dequeueReusableViewWithIdentifier在objective-c端被调用时,查看dequeueReusableViewWithIdentifier的实现,它将检查您的对象是否响应
MyOwnUIView
消息,因为您响应了
Prepareforeuse
消息,它将调用它。希望我能回答你的问题。AlexYou是从UIView继承的,所以不能从NIRecyclableViewProtocol继承,这意味着NIRecyclableViewProtocol可能是一个接口,在这种情况下,PrepareForReuse不会被“重写”,它只会被“实现”。那么,“UIView”的返回/参数类型会自动转换为“UIView”吗?如果是这样,我是否应该创建一个与协议具有相同签名的“助手”接口,以便将其作为接口和所有自定义c#派生视图来实现?请阅读本文,我忘记了2个属性[模型和协议]()
@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 ();
}