UIViewController с Nib-файлом и наследованием - PullRequest
5 голосов
/ 21 января 2011

Я пытаюсь сделать что-то действительно сложное, и я все еще застрял в какой-то момент.Я пытаюсь создать экземпляр UIViewController с файлом Nib, унаследованным от другого UIViewController, с другим файлом Nib.
Проблема в том, когда я создаю экземпляр моего сына UIViewController.

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

Метод init 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.Я понимаю почему, но я начинаю думать, что невозможно делать то, что я хочу.Любое предложение?

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

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

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

На нем должны отображаться IB и сын объекта ...

С уважением
kl94

Ответы [ 2 ]

3 голосов
/ 21 января 2011

Как правило, по этой причине вы должны использовать только конкретное перо в методе 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;
}
1 голос
/ 16 апреля 2014

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...