Xamarin subclass UINavigationController con UINavigationbar personalizado

Estoy intentando crear una barra de navigation superior no estándar para usarla en toda mi aplicación. Para lograr esto, he tratado de subclasificar UINavigationController y UINavigationBar

Tengo una class de NavigationController personalizada

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

que apunta al constructor de base

 public UINavigationController (Type navigationBarType, Type toolbarType); 

para mi class personalizada UINavigationBar TopNavBar que es algo así como …

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

El problema es que TopNavBar nunca se llama cuando ejecuto esto. Si trato de ajustar mi constructor para que se vea así:

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

Recibo una exception de time de ejecución que no puede emitir types, por lo que parece que ignora mi llamada especificando el tipo UINavigationBar .

¿Alguien puede ayudarme con lo que me falta aquí?

EDIT al final resulta que me estaba perdiendo el hecho de que puedes configurar un UINavigationBar personalizado dentro del storyboard. Combinando eso con la respuesta de Miguel, terminé con la class

 partial class TopNavBar : UINavigationBar { public TopNavBar(IntPtr test) : base(test) { } [Export ("initWithCoder:")] public TopNavBar (NSCoder coder) : base (coder) { InitCustom (); } } 

El constructor IntPtr se invoca en respuesta al object que está creando Objective-C y aparece en C #. Esto, en general, no es la forma en que se crean instancias de estas classs.

La primera pregunta que debe hacerse es: ¿quién está creando la instancia de su class?

  • Crea la instancia de esta class desde C #: llama a un constructor con los parameters adecuados.
  • Al crearse durante la deserialization (por ejemplo, cargar desde un guión gráfico, XIB o sus propios datos archivados), debe proporcionar el constructor que toma un parámetro NSCoder.
  • Tener su instancia recreada a pedido (puede indicar un problema, porque significa que su object fue destruido, pero Objective-C mantuvo una reference a este, y ahora está siendo resurgido nuevamente), el constructor IntPtr.

En su ejemplo anterior, hay un error: está reemplazando al constructor IntPtr, que solo debería llamar al constructor IntPtr de la class base (ya que significa "Tengo un puntero al object real en el objective-c, creo un contenedor para eso").

Mi suposition es que está utilizando C #, entonces en ese caso, lo que quiere es proporcionar un nuevo constructor que no tenga arguments:

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