iphone - custom - uiview from xib swift 4
¿Cómo obtengo una vista en Interface Builder para cargar una vista personalizada en otra punta? (2)
Siento que tu dolor cuando se trata de UIViewController es lo único con lo que puedes especificar una carga de plumillas, pero creo que es porque tiene que haber un propietario del archivo, que es un controlador, o algo así, aunque no estoy seguro de por qué. un UIView no puede ser el propietario de un archivo.
Creo que puedes poner las cosas en la biblioteca bajo Objetos personalizados, pero creo que estarías limitado a poner una UIView allí con la clase establecida en una subclase personalizada de UIView. De hecho, busqué en tratar de extender el generador de interfaces y parece que puedes hacerlo para OS X, pero no para iPhone. Implica compilar código para el nuevo widget en el creador de interfaces para decirle cómo dibujar el widget solo dentro de IB. Creo que en realidad hay una plantilla OS X para esto.
Creo que lo que probablemente haría es crear una vista principal en un archivo de plumilla que contenga todas las subvistas, luego en initWithCoder: en el elemento UIAwesomeSauce abra el archivo de la plumilla, cargue la vista principal y solo colóquela dentro de sí mismo para que pueda tener una vista "innecesaria" entre la vista UIAwesomeSauce y las subvistas (o subvistas secundarias, según el caso). No estoy seguro de qué tan ineficiente es esto, pero al mezclar algunas cosas parece que algunas vistas como UIWebView parecen tener Una de estas vistas intermedias aparentemente innecesarias (IIRC).
Si se te ocurre una solución mejor, por favor, dímelo porque también me gustaría saberlo.
EDITAR
Ahora que lo veo, creo que UIView PUEDE ser el propietario del archivo, simplemente no puede configurarlo en IB. Básicamente, llamaría a la carga de la pluma algo como esto en la subclase UIView:
[bundle loadNibNamed: @ propietario de "UISpecialSauce": opciones propias: ...]
Creo que si crea salidas en UISpecialSauce o lo que sea, entonces deberían asignarse correctamente debido al propietario: self.
Estoy creando un widget personalizado que me gustaría usar en múltiples nibs. Así que hago una nueva vista de Screen3 nib, agrego algunos botones y ahora quiero mi widget UIAwesomeSauce.
Si solo agrego una vista y luego cambio la Identidad de la Clase, no obtiene los subelementos de la plumilla UIAwesomeSauce. Lo mismo si voy a la biblioteca y cambio a clases. Parece que solo un UIViewController tiene el campo para "Cargar desde la punta", que sería hermoso.
Sé que puedo cargar el plumín UIAwesomeSauce desde el código, obtener los objetos de nivel superior y colocarlos a mano. Pero el punto de IB es que no tiene que colocar las cosas en código. Aún mejor sería si pudiera conseguir que UIAwesomeSauce aparezca en la lista de la Biblioteca.
RESUELTO - por Nimrod - LEER PARA EXPLICACIÓN Y CÓDIGO
De todos modos, dood, eso es genial. Ahora puedo hacer mis propias clases de widgets para cosas increíbles. Haga que el FileOwner de su UI sea de su clase, y en él solo tenga una UIView normal con todas sus cosas. (La vista única en la punta del widget no puede ser la clase en sí misma, o se vuelve recursiva en initWithCoder). Luego, en la punta en la que desea usarla, cree una vista UIV de vainilla y cambie su clase. No podrás ver realmente el widget dentro de esa casilla, pero trata.
Self ahora es una vista en blanco, y tMyActualSelf es la única vista en la que realizó el trabajo en la otra punta. ¡Hurra!
- (id)initWithCoder:(NSCoder*)coder
{
if ((self = [super initWithCoder:coder]))
{
UIView *tMyActualSelf = nil;
// Initialization code
NSArray *tNibItems = [[NSBundle mainBundle] loadNibNamed:@"UIAwesomeSauce" owner:self options:nil];
for (id object in tNibItems)
{
if ([object isKindOfClass:[UIView class]])
tMyActualSelf = (UIView *)[object retain];
}
if( tMyActualSelf )
{
tMyActualSelf.frame = CGRectMake(0, 0, self.frame.size.width, self.frame.size.height);
[self addSubview:tMyActualSelf];
}
}
return self;
}
Theres un cocoapod que realmente podría ayudar con eso: https://github.com/mobilejazz/NibWrapper
Proporciona una vista de contenedor que carga una vista secundaria de otro NIB. Puede especificar el nombre de ese NIB dentro del generador de interfaz a través de un atributo de tiempo de ejecución.