2011-01-20 17 views
5

Estoy tratando de hacer algo realmente complicado y todavía estoy atascado en un punto. Estoy intentando instanciar un UIViewController con un archivo Nib heredado de otro UIViewController con otro archivo Nib.
El problema es cuando instalo mi hijo UIViewController.UIViewController con Nib File y herencia

// SonViewController 
- (id)initWithNibName:(NSString *)nibNameOrNil 
       bundle:(NSBundle *)nibBundleOrNil 
{ 
    if ((self = [super initWithNibName:nibNameOrNil 
           bundle:nibBundleOrNil])) { 
     // Custom initialization. 
    } 
    return self; 
} 

El método init initWithNibName:bundle: debe llamar a la super class pero sólo llamar a su propio archivo de punta. En la superclase, traté de reemplazar el método initWithNibName:bundle: y poner el mismo nibName así:

// MotherViewController 
- (id)initWithNibName:(NSString *)nibNameOrNil 
       bundle:(NSBundle *)nibBundleOrNil 
{ 
    if ((self = [super initWithNibName:@"MotherViewController" 
           bundle:nibBundleOrNil])) { 
     // Custom initialization. 
    } 
    return self; 
} 

Sólo init y mostrar el Mother Class y su objeto IB. Entiendo por qué, pero empiezo a pensar que es imposible hacer lo que quiero. Cualquier sugerencia ?

Editar:
Me gustaría utilizar mi SonViewController así como así:

SonViewController *son = [[SonViewController alloc] 
         initWithNibName:@"SonViewController" bundle:[NSBundle mainBundle]]; 

[self.navigationController pushViewController:son animated:YES]; 
[son release]; 

Debe mostrar hijo y la madre del IB Objeto ...

Saludos,
kl94

Respuesta

1

Sé que esto es un hilo viejo, pero acabo de encontrar una increíble entrada de blog here.

Básicamente, debe recorrer todas las vistas de la clase principal y agregarlas como subvistas a su clase secundaria. Así es como yo implementé en mi proyecto:

// ChildViewController.m 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self addSubviewsFromSuperclass]; 
} 

// ParentViewController.h 
- (void)addSubviewsFromSuperclass; 

// ParentViewController.m 
- (void)addSubviewsFromSuperclass 
{ 
    UIView *selfView = self.view; 
    UIView *nibView = nil; 
    @try 
    { 
     nibView = [NSBundle.mainBundle loadNibNamed:NSStringFromClass([self superclass]) owner:self options:nil][0]; 
    } 
    @catch (NSException *exception) 
    { 
     NSLog(@"Something exceptional happened while loading nib:\n%@", exception); 
    } 
    self.view = selfView; 
    for (UIView *view in nibView.subviews) 
    { 
     [self.view addSubview:view]; 
    } 
} 

Que addSuviewsFromSuperclass método no es mi codificación. Tengo que dar crédito completo al autor del blogpost que mencioné anteriormente. Descargue su proyecto de ejemplo y lo encontrará en su JMViewController.m.

+0

Como dijiste, esta es una publicación muy antigua. PERO ahora, por su culpa, yo/nosotros sabemos cómo crear 2 controladores de vista con 2 xib y hacer que uno herede del otro. Gracias – klefevre

3

Normalmente, solo debe usar una punta específica en el método init, y no initWithNibName: bundle :, por este motivo.

@implementation MotherViewController 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    if((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { 
     //custom initialization 
    } 
    return self; 
} 
- (id)init { 
    return [self initWithNibName:@"MotherViewController" bundle:nil]; 
} 

Entonces, para usar la punta predeterminado para MotherViewController, sólo tiene que utilizar [[MotherViewController alloc] init];.

Como alternativa, puede definir un inicializador diferente en MotherViewController por este motivo.

@implementation MotherViewController 
- (id)_initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    if((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { 
     //custom initialization 
    } 
    return self; 
} 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    return [self _initWithNibName:@"MotherViewController" bundle:nibBundleOrNil]; 
} 

A continuación, utilice una interfaz de categoría privada para informar a SonViewController sobre este método.

//SonViewController.m 
@interface MotherViewController (PrivateInit) 
- (id)_initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil; 
@end 
@implementation SonViewController 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    if((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { 
     //custom initialization 
    } 
    return self; 
} 
+0

No lo pude hacer funcionar. He actualizado mi publicación para mostrar que quiero usar mi SonViewController – klefevre