2012-06-13 19 views
10

Normalmente creo mis vistas personalizadas de forma programática y las intento para que se inicialicen también programáticamente con métodos init personalizados (por ejemplo, initWithFrame: SomeParam: OtherParam). ¿Es posible usar esas vistas personalizadas en combinación con un archivo xib? Es decir, ¿tiene un archivo xib principal que tiene varias de estas vistas personalizadas como subvistas en las que estas subvistas pueden necesitar un método init diferente?Vistas personalizadas de iOS en archivos xib

Respuesta

10

Si agrega vistas personalizadas en un archivo xib, no se puede utilizar un inicializador personalizado. Todos serán inicializados usando initWithCoder.

Normalmente harías cualquier configuración en un método común llamado desde allí o en awakeFromNib.

Si necesita establecer propiedades personalizadas en su vista que se originan desde fuera de él, hágalo en viewDidLoad de su controlador de vista.

+0

Si necesito hacer algo antes de verDidLoad de mi controlador de vista, cómo hacerlo eso ? Entonces ejemplo ... Mi vista se usa para mostrar una página de un libro.Sin el método init personalizado como initWithPage: page, al mismo tiempo también uso el guión gráfico. Antes – Carina

+1

viewDidLoad, no existe la vista. Basta con mover la configuración que se hace en initWith ... en un método diferente y hacer los cambios que necesita allí, después de establecer la propiedad. – jrturton

3

por supuesto es posible. arrastre una uiview en el xib no dentro de la vista predeterminada. luego haga un IBOutlet UIView *myCustomView; y luego conéctelo con la otra vista. cuando u desea mostrar esta vista añadir esto como [self.view addSubview:myCustomView]; cuando quiera quitarlo

[myCustomView removeFromSuperView];

enter image description here

+0

Entonces ... ¿qué tal initWithSomeValue: value function? – Carina

+0

Esto no funcionará si quiere compartir, digamos una vista de encabezado personalizado en múltiples archivos XIB ... Debería redefinirlo exactamente en cada xib – LightningStryk

6

Obtenga el xib de la vista inicializado de la manera habitual y utilizando la referencia haga la configuración personalizada. esta parte se puede poner en el método init así-

 -(void)initfunction{ 
     UIView *containerView = [[[NSBundle mainBundle] loadNibNamed:@"myView" owner:self options:nil] lastObject]; 
     containerView.property1 = xyz;//Customization 
     containerView.property2= abc;//Customization 
     containerView.frame = CGRectMake(x,y,z,p);//Customization 
     [rootView addSubview:containerView]; 


    } 

el punto es cuando usamos un xib que no inicializan de manera explícita, las funciones de utilidad xib devuelven un objeto inicializado (de UIView), después se tiene la UIView objeto, él/ella puede usar el objeto inicializado como solo un objeto regular para hacer más cambios personalizados.

0

Las clases UINib (iOS) y NSNib (OS X) proporcionan un mejor rendimiento en situaciones en las que desea crear múltiples copias de los contenidos de un archivo de punta. El proceso normal de carga de plumillas implica leer el archivo plumín desde el disco y luego crear instancias de los objetos que contiene. Sin embargo, con las clases UINib y NSNib, el archivo nib se lee del disco una vez y los contenidos se almacenan en la memoria. Debido a que están en la memoria, crear conjuntos sucesivos de objetos lleva menos tiempo porque no requiere acceder al disco.

  1. Crear un archivo de vista xib: Haga clic derecho en el proyecto -> New File -> Interfaz de usuario -> Ver (por ejemplo, tendrá "MyView.xib")
  2. llenar la vista usando el Interface Builder
  3. Añadir siguiente método para que los padres componente

    static UINib *nib = nil; 
    
    - (UIView*)createNewViewFromNib: (NSString *)nibFileName 
    { 
        if(nib == nil) { 
         nib = [UINib nibWithNibName:nibFileName bundle:nil ]; 
        } 
    
        // Unarchiving objects from the nib. You can do it multiple times to create a number of objects from same nib. 
        NSArray* topLevelObjs = [nib instantiateWithOwner:self options:nil]; 
    
        if (topLevelObjs == nil) 
        { 
         NSLog(@"Warning! Could not load nib file.\n"); 
         return nil; 
        } 
        // We have only one view in the nib. 
        return [topLevelObjs objectAtIndex:0]; 
    } 
    
  4. uso siguiente línea de código para crear una instancia permite ver con objeto reutilizable plumín:

    UIView *item = [self createNewViewFromNib:@"MyView"]; 
    // [self.view addSubview:item]; 
    
Cuestiones relacionadas