Как загрузить несколько файлов пера с помощью NSBundle loadNibNamed :? - PullRequest
2 голосов
/ 26 августа 2010

Я пытаюсь загрузить свою иерархию представлений через вызовы loadNibNamed.

Для одного пера, в моем ApplicationViewController : UIViewController:

- (void) loadView {
    [super loadView];
    [[NSBundle mainBundle] loadNibNamed:@"ApplicationViewController" 
                                  owner:self options:nil];
}

Но затем в SubViewController : ApplicationViewController:

- (void) loadView {
    [super loadView];
    [[NSBundle mainBundle] loadNibNamed:@"SubViewController" 
                                  owner:self options:nil];
}

Когда я инициализирую SubViewController,представление содержит только свой собственный nib-файл, как мне получить те же данные из super?

Я пытался вставить объекты, возвращенные из вызова в NSBundle, обратно в собственное представление вызывающего UIViewControllerиерархии, но это не сработало, и некоторые проблемы с кастингом не позволяют мне отладить это ...

Ответы [ 3 ]

5 голосов
/ 26 августа 2010

В вашем примере, вероятно, происходит то, что в обоих файлах пера вы устанавливаете выход view.Затем происходит то, что второй загруженный файл пера перезапишет значение свойства view, установленное первым файлом пера:

@implementation SubViewController

- (void) loadView
{
    [super loadView];
    // at this point, self.view points to the view loaded from
    // ApplicationViewController.nib
    [[NSBundle mainBundle] loadNibNamed:@"SubViewController" 
                              owner:self options:nil];
    // but at this point, self.view is overwritten with the view from
    // SubViewController.nib
}
...
@end

Итак, вы можете сделать следующее: в вашем классе SubViewController объявитедругой выход, скажем так:

@property (nonatomic, retain) IBOutlet UIView* viewForSubController;
//you can probably think of a better name for it.

и в вашем xib-файле не установлено свойство view, а вместо него установлен viewForSubController.А затем в loadView сделайте что-то вроде:

@implementation SubViewController

- (void) loadView
{
    [super loadView];
    // at this point, self.view points to the view loaded from
    // ApplicationViewController.nib
    [[NSBundle mainBundle] loadNibNamed:@"SubViewController" 
                              owner:self options:nil];
    // now, self.viewForSubController points to the view loaded from
    // SubViewController.nib

    // so now we can do this:
    [self.view addSubview: self.viewForSubController];
}
...
@end

Или что-то в этом роде.

2 голосов
/ 26 августа 2010

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

self.myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];

Таким образом, каждый контроллер представления загружает контроллеры содержащихся представлений. Тогда вам может понадобиться, а может и нет, явно добавить представление контроллеров (myViewController.view) к родителю с помощью вызова:

[window addSubview: myController.view];

Возможно, вы захотите проверить QuartzDemo или UICatalog от Apple для примера кода, который загружает множество дочерних контроллеров представления, хотя он добавляет его в список вместо представления.

0 голосов
/ 27 августа 2010

Вы действительно не должны загружаться с кончика в loadView.Целью переопределения этого метода является создание собственных представлений программным способом.Вы можете вызвать initWithNibName: из стандартного init, но похоже, что вы пытаетесь объединить два представления вместе.Я не думаю, что подклассы будут делать это так, как вы хотите.Вы можете сделать так, чтобы родительское представление загружало дочернее представление и добавляло его свойство представления в иерархию родительского представления.Это то, что вы пытаетесь сделать?

...