¿Cómo consigo una vista en Interface Builder para cargar una vista personalizada en otra punta?

StackOverflow https://stackoverflow.com/questions/3944964

Pregunta

Estoy haciendo un widget personalizado que me gustaría utilizar en múltiples puntas. Así que hago una vista nueva semilla Screen3, añadir algunos botones, y ahora quieren mi aparato UIAwesomeSauce.

Si Acabo de añadir una vista y luego cambiar la identidad de clase, que no recibe los subelementos de la punta UIAwesomeSauce. Lo mismo si voy a la biblioteca y cambiar a clases. Parece sólo UIViewController tiene el campo de "carga a partir de cacao", lo que sería hermoso.

sé que puedo cargar la punta UIAwesomeSauce de código, obtener los objetos de nivel superior, y colocarlo con la mano. Pero el punto de IB es por lo que no tiene que colocar las cosas en el código. Aún mejor sería si pudiera conseguir UIAwesomeSauce a aparecer en la lista Biblioteca en sí.

SOLUCIONADO - por Nimrod - Siga leyendo para EXPLICACIÓN Y CÓDIGO

De todos modos, Dood, que es grande. Puedo hacer mis propias clases de widgets ahora para tonta Materia impresionante. Hacer que el fileowner de la interfaz de usuario plumín de su clase, y en ella sólo hay un UIView normal con todas sus cosas. (La vista sola en punta del widget no puede ser la propia clase, o se obtiene recursiva en initWithCoder.) Luego, en la punta desea usarlo, hacer una UIView vainilla y cambiar su clase. Usted no será capaz de ver realmente el widget dentro de ese cuadrado, pero trato.

Ser es ahora una visión en blanco y tMyActualSelf es la única vista que hizo 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;
}
¿Fue útil?

Solución

Me siento su dolor cuando se trata de la UIViewController ser el único que se puede especificar una carga punta con, pero yo creo que es porque tiene que ser propietario de un archivo que es un controlador, o algo por el estilo, aunque estoy no está seguro de por qué un UIView no puede ser de un propietario del archivo.

creo que se puede poner las cosas en la biblioteca bajo objetos personalizados, pero creo que estaría limitado a poner un UIView allí con la clase acaba de establecer a una subclase personalizada de UIView. De hecho, me miraba a tratar de extender constructor de interfaces y parece que se puede hacer para OS X cosas, pero no para iPhone cosas. Se trata de la compilación de código para el nuevo widget en el constructor de interfaces para decirle cómo dibujar el widget sólo dentro de IB. Creo que hay en realidad una plantilla de OS X para esto.

Creo que lo que probablemente haría es crear una vista principal en un archivo semilla que contiene todos los subvistas, a continuación, en initWithCoder: en lo UIAwesomeSauce abrir el archivo semilla, cargue la vista principal, y sólo tiene que colocar en el interior de auto para que tenga una visión "innecesaria" entre la vista y las UIAwesomeSauce subvistas (o sub subvistas según sea el caso sería.) no estoy seguro de lo ineficaz que es, pero en ensuciar con algunas cosas que parece que algunos puntos de vista como UIWebView parecen tener uno de estos puntos de vista intermedios aparentemente unnecssary (IIRC).

Si se llega a una solución mejor por favor dime porque me gustaría saber también.

editar

Ahora que lo miro, creo que el UIView PUEDE ser el propietario del archivo, que simplemente no puede configurarlo en IB. Básicamente que se dice algo de la carga punta como este en el UIView subclase:

[lote loadNibNamed: @ "" UISpecialSauce propietario: opciones de asistencia: ...]

Creo que si crea puntos de venta en UISpecialSauce o lo que sea, entonces se le debe asignar correctamente debido al propietario:. Auto

Otros consejos

Hay un cocoapod que en realidad puede ayudar con lo siguiente: https://github.com/mobilejazz/NibWrapper

Proporciona una vista envoltorio que cargas una vista niño de otro SEMILLA. Se puede especificar el nombre de ese atributo dentro de la SEMILLA interfaz del generador a través de un tiempo de ejecución.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top