2012-06-25 16 views
6

Al usar MonoTouch, intento hacer una vista personalizada, por lo que puedo reutilizar esta vista varias veces en una pantalla. (es un montón de etiquetas y botones) Después de leer la respuesta a esta publicación: How to add a custom view to a XIB file defined view in monotouch Debo acercarme, pero esto solo parece permitirme agregar una vista personalizada, definida en myCustomView.CS, pero lo que Estoy buscando una forma de usar un .XIB separado para diseñar mi vista personalizada en el constructor de interfaz y solo usar el archivo cs correspondiente para agregar lógica. Si intento hacer un XIB con el mismo nombre, el contenido no se volverá visible.Crear una vista personalizada usando un xib

pasos seguidos:

  • En MyCustomView.CS he puesto [Register("MyCustomView")].

  • implementé el constructor public MyView(IntPtr handle) : base(handle) {}

  • abierto ViewController.XIB en Interface Builder, añadir un UIView y establece que es la clase de MyCustomView.

Cuando ejecuta este código, veo la UIView que acaba de agregar, pero no los elementos dentro de la vista, es decir, el contenido de MyCustomView.XIB

si añado algo que el código de MyCustomView. CS, como this.Backgroundcolor = UIColor.Blue; esto se muestra, pero los elementos añadidos a .XIB no lo son. ¿Cómo le digo a Monotouch que muestre todas las cosas definidas dentro de MyCustomView.XIB?

En muestras de Objective-C veo cosas como "initWithNib" Desafortunadamente, la sección "LoadNib" no está documentada en la API de Monotouch, pero parece algo que debería hacer, pero ¿cómo y dónde?

+0

Podría dar el código que está utilizando para agregar la vista xib? Gracias. –

Respuesta

4

Una muy buena pregunta, pero se trata más sobre cómo funcionan los XIB y qué podemos hacer al respecto.

El problema es que cuando agrega un objeto a un XIB y lo configura como una clase personalizada, simplemente le indica al UIKit que cree una instancia de este objeto. El hecho de que veas en IB como una vista, un botón o un control considerable es exactamente como IB lo atrae por ti. De esta manera, la responsabilidad de crear la perspectiva recae completamente en su clase.

En Objective-C podemos hacer un buen truco para tener XIB con vistas personalizadas y aún agregarlas a IB estableciendo el nombre de clase de la vista agregada. Esto es posible porque puede devolver cualquier instancia desde el método -init de su clase en Objective-C, lo que no es posible con C#.

Sin embargo, todavía se puede facilitar su vida haciendo lo siguiente:

  1. Definamos XI ter para ser un XI ter que contiene el contenido de su vista personalizada; Ubicación para ser un XIB en el que desee agregarle una vista personalizada.
  2. crearle vista personalizada y una clase XI ter sentar las interioridades de que el método awakeFromNib
  3. manija para cargar realmente su XI ter
  4. Después de haber cargado su XI ter sólo tiene que añadir la parte interna de la misma a la instancia como subvistas.
  5. Poner una vista normal y configurarla en el suyo propio en Ubicación
  6. ¡Disfrútalo!

Usted tiene, sin embargo, para aceptar que su XI ter contendría una vista raíz o algo así, que se añadiría como subvista en la instancia de la clase poner en Colocación.

esta manera, usted debe tener algo como:

XI ter con el contenido de su vista personalizada:

XIB with your custom view contents

Colocación donde se agrega el XI ter:

Placement where you add your XIB

Como la instancia de vista agregada a su ubicación es el mismo como Propietario de archivo en su XIB, puede establecer salidas y acciones en tanto XIB como Ubicación. Simplemente no olvides que la vista raíz en tu XIB no es la instancia que UIKit creará para ubicarla en la ubicación.

Por razones de conveniencia, por favor encontrar mi código de abajo que es la clase base para facilitar la creación de tales puntos de vista:

using System; 

using MonoTouch.ObjCRuntime; 
using MonoTouch.Foundation; 
using MonoTouch.UIKit; 

namespace Member.iOS.Base.Views { 

    /// <summary> 
    /// XibView is a Xib-backed UIView subclass which enables easy customization and custom 
    /// behavior addition. 
    /// </summary> 
    public class XibView : UIView { 

     /// <summary> 
     /// Exception thrown when a loaded XIB doesn't contain any views inside it. 
     /// </summary> 
     class EmptyXibException : Exception { 
     } 

     /// <summary> 
     /// Initializes a new instance of the <see cref="Member.iOS.Base.Views.XibView"/> class. 
     /// </summary> 
     /// <param name='handle'> 
     /// Handle. 
     /// </param> 
     public XibView(IntPtr handle) : base(handle) { 
     } 

     /// <summary> 
     /// Upon loading from a containing XIB, takes care of replacing the current instance (which acts as a stab) with 
     /// a real view loaded from its XIB. 
     /// </summary> 
     public override void AwakeFromNib() { 
      base.AwakeFromNib(); 

      NSArray views = NSBundle.MainBundle.LoadNib(GetType().Name, this, new NSDictionary()); 

      if (views.Count == 0) { 
       throw new EmptyXibException(); 
      } 

      UIView rootView = Runtime.GetNSObject(views.ValueAt(0)) as UIView; 
      rootView.Frame = new System.Drawing.RectangleF(0, 0, Frame.Width, Frame.Height); 
      AddSubview(rootView); 
     } 

    } 
} 
6

Con base en mi experiencia en código obj-c, voy a tratar el siguiente código:

var views = NSBundle.MainBundle.LoadNib(nibName, this, null); // (1) 
MyCustomView myView = Runtime.GetNSObject(views.ValueAt(0)) as MyCustomView; // (2) 

(1) le permite cargar el archivo xib

(2) le permite convertir a convierta un IntPtr en un tipo NSObject (sub-) apropiadamente tipeado.

Una vez que tenga myView puede agregarlo como una vista tradicional. Verifica si has configurado la salida para tu vista correctamente.

P.S. Si proporciona otros detalles, podemos ayudarlo. Además, verifique el código porque lo he escrito a mano.

Cuestiones relacionadas