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