confundido acerca de initWithCoder y personalizado UIViews

Estoy tratando de crear una personalizada UIView que trae es vista desde un archivo nib.

En mi controlador tengo algo así como:

self.arcView=[[JtView alloc] initWithCoder:self];
self.arcView.backgroundColor=[UIColor redColor];
self.arcView.frame=CGRectMake(30.0f,200.0f, 100.0f, 100.0f);
[self.view addSubview:self.arcView];

Mi primera pregunta es ¿qué debe ir en el argumento para initWithCoder (NSCoder *)? Traté de auto pero tengo un incompatibles tipo de puntero, pero este parecía funcionar. Pero en la pregunta #2:

Segundo, el argumento es que el uso de initWithCoder con nibs y initWithFrame a la hora de poner su vista personalizada en un marco. Bien, quiero cargar un nib en mi vista personalizada y, a continuación, ponerlo en un marco. Puedo añadir un marco como el de arriba y que está bien (parece que funciona)?

Echa un vistazo aquí por favor y vea el ejemplo de código stackoverflow.com/a/17798646/381807 – nesimtunc

OriginalEl autor timpone | 2013-03-01

4 respuestas

  1. 9

    Lo están haciendo al revés: no eres tú quien debe llamar initWithCoder:, es la aplicación de la loadNibNamed:owner: método que hace.

    Lo que usted necesita hacer en su código está llamando

    UIView *view = [[[NSBundle mainBundle] loadNibNamed:@"theNIB" 
                                                  owner:self 
                                                options:nil] objectAtIndex:0];

    Este sería separar la PUNTA, y llame a su initWithCoder: inicializador, y darle de nuevo una vista con todos los puntos de venta conectados.

    No este método retorna un NSArray de todos los objetos de nivel en la PUNTA? ¿Qué pasa si el UIView no es el primero?
    thx, trabajando a través de este derecho ahora. He pedido otra pregunta (lo siento por el spam pero me siento como tengo que entender esto).

    OriginalEl autor

  2. 9

    initWithCoder es llamado mucho antes de init y viewDidLoad métodos. Y nunca te llaman. Que se llama como cargar un archivo nib de su mainBundle.

    Sin embargo, recibe NSCoder como un argumento. Comprobar cómo se llama en una clase:

    - (id)initWithCoder:(NSCoder *)aDecoder {
        if ((self = [super initWithCoder:aDecoder])) {
            [self baseClassInit];
        }
        return self;
    }
    
    - (void)baseClassInit {
    
        //initialize all ivars and properties    
    }
    esta parece ser la idea de derecho.

    OriginalEl autor

  3. 1
    self.arcView = [[[NSBundle mainBundle] loadNibNamed:@"JtView" owner:self options:nil] objectAtIndex:0];
    self.arcView.frame = CGRectMake(30.0f,200.0f, 100.0f, 100.0f);
    self.arcView.backgroundColor = [UIColor redColor];
    [self.view addSubview:self.arcView];

    Que va a funcionar y no llamar initWithCoder:.

    OriginalEl autor

  4. 1

    Nunca llame initWithCoder de forma explícita, se hace llamar implícitamente, mientras que descomprimir archivados objeto y inicializar el objeto de ivars y propiedades de Archivo de objeto puede ser el modelo personalizado de la clase guardado en la persistencia de almacenamiento o una vista personalizada cargado de archivo xib.

    En su clase es de parecer que están tratando de crear una vista personalizada, por lo que la carga de archivo xib, por referencia a @dasblinkenlight código es una solución perfecta.

    OriginalEl autor

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *