2011-01-20 2 views
5

Я пытаюсь сделать что-то действительно сложное, и я все еще застрял в точке. Я пытаюсь указать UIViewController с файлом Nib, унаследованным от другого UIViewController с другим файлом Nib.
Проблема в том, когда я создаю экземпляр своего сына 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; 
} 

Метод инициализации initWithNibName:bundle: должен вызвать super class но только назвать свой собственный файл острия. В супер-класса, я попытался переопределить метод initWithNibName:bundle: и поставить nibName себя так:

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

Это только инициализации и отображения Mother Class и его IB объект. Я понимаю, почему, но я начинаю думать, что невозможно делать то, что я хочу. Любое предложение ?

Edit:
Я хотел бы использовать мой SonViewController просто так:

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

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

Он должен показывать сына и мать IB объект ...

С уважением,
kl94

ответ

1

Я знаю, что это старая нить, но я только что нашел невероятно блог here.

По существу, вам нужно выполнить итерацию по всем представлениям родительского класса и добавить их в качестве подзонов в ваш дочерний класс. Вот как я реализовал это в моем проекте:

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

То, что addSuviewsFromSuperclass метод не мое кодирование. Я должен полностью отнестись к автору блога, упомянутого выше. Загрузите его примерный проект, и вы найдете его в своем JMViewController.m.

+0

Как вы сказали, это очень старое сообщение. НО теперь, из-за вас, я/Мы знаем, как создать 2 контроллера представления с 2 xib и сделать их наследуемыми от другого. Спасибо – klefevre

3

Как правило, вы должны использовать только определенный nib в методе init, а не initWithNibName: bundle :, по этой причине.

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

Затем, чтобы использовать перо по умолчанию для MotherViewController, вы просто использовать [[MotherViewController alloc] init];.

В качестве альтернативы вы можете определить другой инициализатор в 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]; 
} 

Затем, используя интерфейс частной категории, сообщите SonViewController об этом методе.

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

Я не работал, чтобы работать. Я обновляю свой пост, чтобы показать, что я хочу использовать свой SonViewController. – klefevre