2009-11-17 15 views
9

Trataré de hacer esto lo más breve posible.Nesting Custom Classes/XIB's con Interface Builder

Escribí una clase personalizada que amplía UIView con un par de propiedades de IBOutlet, y tiene un XIB asociado al que están vinculadas esas IBOutletas.

Entonces quiero tomar esa clase, incrustarla en algún otro XIB (por ejemplo, una celda de tabla), y simplemente hacer que funcione.

Parece que cuando incrusté esa clase personalizada en el nuevo XIB, no reconoce el XIB original asociado con él, por lo que me pide restablecer los IBOutlets a los elementos de interfaz en el nuevo XIB. Esto apesta.

¿Alguien entiende lo que estoy tratando de hacer y tiene un buen enfoque?

Respuesta

8

Así es como me las arreglé para hacer este trabajo:

En Interface Builder
Abra su plumín exterior y hacer esto:

  • Añadir un UIView para definir el espacio en el que desea que su punta interior para mostrar.
  • Agregue un objeto UIViewController de la biblioteca, establezca su propiedad Nombre de plumilla en el nombre de su archivo de punta interno (sin la extensión).
  • Crea IBOutlet para estos dos elementos en tu controlador de vista exterior y conéctalos. (Me referiré a ellos como Innerview y innerViewController.)
  • No conecte cualquiera de las IBOutlets definidas en el controlador de vista interno a nada en el archivo de punta externa, dejarlos sin conectar.

En Xcode
En el método viewDidLoad de su controlador de vista exterior, añadir estas dos líneas:

[self.innerView addSubview:self.innerViewController.view]; 
self.innerViewController.view.frame = CGRectMake(0, 0, self.innerView.frame.size.width, self.innerView.frame.size.height); 

Si su plumín exterior es un UITableViewCell encargo, poner esas líneas en su awakeFromNib método en su lugar.

compilación & Ejecutar!

+0

Funciona de la misma manera en OS X, simplemente reemplace las clases de UI con sus equivalentes NS. – Mark

1

Supongo que simplemente está poniendo UIViews en una punta para usar con un UIViewController que está puramente en código. Apple llama esto a detached nib file.

Sigue la guía para más detalles y ejemplos de cómo hacer que funcione.

En cuanto a la incrustación de una vista dentro de otra en Interface Builder, necesita add a UIView element from the Library en la vista primaria y set its class in the Inspector. Una vez que se establece la clase de la vista incrustada, sus IBOutlet deben estar visibles.

+1

Esa primera frase no es exactamente lo que estoy haciendo. La clase en sí es una UIView, y contiene un UIImageView y un UIActivityIndicator. Esa última frase es correcta, pero desafortunadamente no se comporta correctamente. Levanta los IBOutlets. –

Cuestiones relacionadas