2013-06-02 48 views
2

如何在「實施協議的類型」Objective-c參數的MonoTouch綁定中定義參數/返回類型,例如「UIView<NIRecyclableView>」。MonoTouch綁定類型<implementationprotocol>

例如,檢查此頭文件。

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

在相同的頭文件,你有一個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(); 
} 

一個協議就像嗨這個對象也可以響應這個目標-c消息,如果你想要的話,所以你可以手動內聯他們在接口定義像我們做阿博ve或NIRecyclableView : NIRecyclableViewProtocol,在這種情況下我們不必。

希望這有助於

亞歷

+0

我明白了這一點,但是,雨雲創建這些簡單的類堅持爲用戶輕鬆實現。在整個(幾乎?)框架中,他們使用協議而不是基類來獲得靈活性。如果使用協議NIRecyclableView從UIView繼承的「SampleClass」可以綁定爲從超類「NIRecyclableView」繼承的「SampleClass」,那麼這將起作用。這可能嗎? –

+0

你必須自己實現協議,讓我們認爲你像上面所做的那樣用一個小修改來綁定protcol'UIView DequeueReusableView(string reuseIdentifier);'而不是'NIRecyclableView DequeueReusableView(string reuseIdentifier);',現在你將擁有ac#類型調用'NIRecyclableViewProtocol',現在讓我們考慮創建一個名爲'MyOwnUIView:UIView'的自己的'UIView'類,並且你希望'MyOwnUIView'實現'PrepareForReuse()'方法,你需要做'MyOwnUIView:UIView,NIRecyclableViewProtocol'和你可以在你的類 – dalexsoto

+0

實現上覆蓋'PrepareForReuse()',這樣你就可以將自己的邏輯添加到實現中,所以現在當dequeueReusableViewWithIdentifier在objective-c端被調用時'看看dequeueReusableViewWithIdentifier' [這裏](https: //github.com/jverkoey/nimbus/blob/master/src/core/src/NIViewRecycler.m#L82)它會檢查你的對象MyOwnUIView' resp 「prepareForReuse」消息,因爲你做了,它會調用它[這裏](https://github.com/jverkoey/nimbus/blob/master/src/core/src/NIViewRecycler.m#L83)。希望我回答你的問題。亞歷克斯 – dalexsoto

相關問題