2015-10-09 69 views
3

我想創建一個非標準的頂部導航欄供我的應用程序使用。爲了實現這一點,我一直在試圖子類UINavigationControllerUINavigationBarXamarin子類UINavigationController與自定義UINavigationBar

我有一個自定義NavigationController

partial class ZooNavigationController : UINavigationController 
{ 
    public ZooNavigationController (IntPtr handle) : base (typeof(TopNavBar), null) 
    { 
     this.Handle = handle; 
    } 
} 

指向基構造

public UINavigationController (Type navigationBarType, Type toolbarType); 

爲我定製UINavigationBarTopNavBar這就像...

public class TopNavBar : UINavigationBar 
{ 
    public TopNavBar() 
    { 
     InitCustom(); 
    } 

    public void InitCustom(){ 
     this.BackgroundColor = UIColor.Red; 
     // a bunch more custom stuff 
    } 
} 

問題是,當我運行這個時,TopNavBar永遠不會被調用。如果我儘量調整我的構造看起來像這樣:

public ZooNavigationController (IntPtr handle) : base (typeof(TopNavBar), null) 
    { 
     this.Handle = handle; 
     TopNavBar test = (TopNavBar)this.NavigationBar; 
    } 

我得到一個運行時異常,它不能投的類型,因此它似乎它無視我的電話指定UINavigationBar類型。

任何人都可以幫我解決我在這裏失蹤的事嗎?

編輯最後事實證明我錯過了可以在故事板中設置自定義UINavigationBar的事實。結合,與米格爾的答案,我結束了與類

partial class TopNavBar : UINavigationBar 
{ 
    public TopNavBar(IntPtr test) : base(test) { 
    } 

    [Export ("initWithCoder:")] 
    public TopNavBar (NSCoder coder) : base (coder) { 
     InitCustom(); 
    } 
} 

回答

3

的IntPtr的構造函數被調用響應對象的Objective-C的創建和浮出水面C#。這通常不是這些類被實例化的方式。

你必須問自己的第一個問題是:誰在創建你的班的實例?

  • 您從C#中創建此類的實例:您使用正確的參數調用構造函數。
  • 在反序列化期間(例如,從故事板,XIB或您自己的歸檔數據加載)創建,則需要提供帶有NSCoder參數的構造函數。
  • 讓您的實例按需重新創建(可能表示存在問題,因爲這意味着您的對象已被銷燬,但Objective-C保留對其的引用,現在又重新渲染)IntPtr構造函數。

在你上面的例子,有一個錯誤:要覆蓋IntPtr的構造函數,它應該永遠只能調用到基類的構造函數的IntPtr(因爲它的意思是「我有一個指向objective-真實對象c,爲它創建一個包裝器「)。

我的猜測是,你正在使用C#,所以在這種情況下,你想要的是提供一種新的構造函數,它沒有參數:

public ZooNavigationController() : base (typeof (YourNavigation), typeof(YourBar)) { 
    // Your own initialization goes here 
} 
相關問題