2011-01-20 19 views
5

Próbuję zrobić coś naprawdę podstępnego i nadal tkwię w punkcie. Próbuję wstawić plik UIViewController z plikiem Nib odziedziczonym po innym pliku UIViewController z innym plikiem Nib.
Problem polega na tym, że tworzę instancję mojego syna UIViewController.UIViewController with Nib File and Inheritance

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

Sposób startowych initWithNibName:bundle: powinna wywołać super class ale to tylko zadzwonić własny plik nib. W super klasy, starałem się zastąpić metodę initWithNibName:bundle: i umieścić nibName sobie tak:

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

To tylko startowy i wyświetlić Mother Class i jego IB Object. Rozumiem, dlaczego, ale zaczynam myśleć, że niemożliwe jest robienie tego, co chcę. Jakieś sugestie ?

Edit:
użyłbym mój SonViewController właśnie tak:

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

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

Powinno wyświetlić syn i matka IB Object ...

Pozdrowienia,
kl94

Odpowiedz

1

Wiem, że to stary wątek, ale ja po prostu znaleźć niezwykle blogu here.

Zasadniczo konieczne jest powtórzenie wszystkich widoków klasy nadrzędnej i dodanie ich jako subskrybentów do klasy dziecka. Oto jak I wdrożone w moim projekcie:

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

Że addSuviewsFromSuperclass metoda nie jest mój kodowania. Muszę przyznać autorowi wymienionego wyżej wpisu na blogu. Pobierz swój przykładowy projekt, a znajdziesz go w swoim JMViewController.m.

+0

Jak już powiedziałeś, jest to bardzo stary post. ALE teraz, z twojego powodu, ja/wiemy, jak stworzyć 2 kontrolery widoku z 2 xib i uczynić je dziedziczącymi od drugiego. Dziękuję – klefevre

3

Normalnie, powinieneś używać tylko określonej końcówki w metodzie init, a nie initWithNibName: bundle: z tego powodu.

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

Następnie, aby użyć domyślnego stalówkę do MotherViewController, wystarczy użyć [[MotherViewController alloc] init];.

Jako alternatywę można zdefiniować inny inicjator w MotherViewController z tego powodu.

Następnie użyj interfejsu kategorii prywatnych, aby poinformować SonViewController o tej metodzie.

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

Nie udało mi się go uruchomić. Zaktualizowałem swój post, aby pokazać Chcę używać mojego SonViewController – klefevre