【问题标题】:MonoTouch binding type<implementingprotocol>MonoTouch 绑定类型<实现协议>
【发布时间】:2013-06-02 06:02:57
【问题描述】:

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

例如,检查这个头文件。

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?

【问题讨论】:

    标签: c# binding xamarin.ios


    【解决方案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,在这种情况下我们没有必须。

    希望对你有帮助

    亚历克斯

    【讨论】:

    • 我理解这一点,但是 Nimbus 坚持创建那些简单的类以便用户轻松实现。在整个(几乎?)框架中,他们使用协议而不是基类以实现灵活性。如果使用协议 NIRecyclableView 从 UIView 继承的“SampleClass”可以绑定为从超类“NIRecyclableView”继承的“SampleClass”,这将起作用。这可能吗?
    • 您必须自己实现协议,假设您像我上面所做的那样绑定协议,只需稍加修改UIView DequeueReusableView (string reuseIdentifier); 而不是NIRecyclableView DequeueReusableView (string reuseIdentifier);,现在您将拥有一个名为NIRecyclableViewProtocol 的c# 类型和现在假设您创建了自己的 UIView 类,名为 MyOwnUIView : UIView 并且您希望 MyOwnUIView 实现 PrepareForReuse () 方法,您需要执行 MyOwnUIView : UIView, NIRecyclableViewProtocol 并且您将在您的类上覆盖 PrepareForReuse ()
    • 实现,因此您可以将自己的逻辑添加到实现中,所以现在当 dequeueReusableViewWithIdentifier 在objective-c端调用look at the implementation of dequeueReusableViewWithIdentifierhere时,它将检查您的对象MyOwnUIView是否响应@ 987654342@ 消息,既然你这样做了,它就会称之为here。希望我回答你的问题。亚历克斯
    • 你是从 UIView 继承的,所以你不能从 NIRecyclableViewProtocol 继承,这意味着 NIRecyclableViewProtocol 可能是一个接口,在这种情况下,PrepareForReuse 不会被“覆盖”,它只是“实施的”。话虽如此,我的“UIView”返回/参数类型会自动转换为“UIView”吗?如果是这样,我是否应该创建一个与协议具有相同签名的“帮助”接口,以便我可以将它们实现为接口和我的所有自定义 c# 派生视图?
    猜你喜欢
    • 2021-10-19
    • 2022-01-21
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多