2011-01-20 32 views
5

Sto provando a fare qualcosa di veramente difficile e sono ancora bloccato in un punto. Sto tentando di istanziare un UIViewController con un file pennino ereditato da un altro UIViewController con un altro file pennino.
Il problema è quando istanziato mio figlio UIViewController.UIViewController con Nib File ed Eredità

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

Il metodo init initWithNibName:bundle: dovrebbe chiamare il super class ma solo chiamare un proprio file pennino. Nella classe super, ho cercato di override del metodo initWithNibName:bundle: e mettere il nibName me stesso in quel modo:

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

E 'solo init e visualizzare la Mother Class e il suo oggetto IB. Capisco perché, ma comincio a pensare che è impossibile fare ciò che voglio. Qualche suggerimento ?

Edit:
vorrei utilizzare il mio SonViewController proprio così:

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

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

Si dovrebbe visualizzare il figlio e la madre IB oggetto ...

saluti,
kl94

risposta

1

So che questo è un vecchio thread, ma ho appena trovato un post sul blog incredibilmente here.

In sostanza, è necessario scorrere tutte le viste della classe genitore e aggiungerle come sottoview alla classe figlia. Ecco come ho implementato nel mio progetto:

// 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]; 
    } 
} 

Che addSuviewsFromSuperclass metodo non è il mio codice. Devo dare pieno credito all'autore del blogpost che ho menzionato sopra. Scarica il suo progetto di esempio e lo troverai nel suo JMViewController.m.

+0

Come hai detto, questo è un post molto vecchio. MA ora, grazie a te, io/Noi sappiamo come creare 2 controller di vista con 2 xib e farli ereditare dall'altro. grazie – klefevre

3

Normalmente, si dovrebbe usare solo un pennino specifico nel metodo init, e non in initWithNibName: bundle :, per questo 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]; 
} 

Poi, per usare il pennino predefinito per MotherViewController, è sufficiente utilizzare [[MotherViewController alloc] init];.

Come alternativa, per questo motivo è possibile definire un inizializzatore diverso in MotherViewController.

@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]; 
} 

Quindi, utilizzare un'interfaccia di categoria privata per comunicare a SonViewController questo metodo.

//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

Non ce l'ho fatta per funzionare. Ho aggiornato il mio post per mostrare che voglio usare il mio SonViewController – klefevre