2010-08-26 39 views
2

我想通過調用loadNibNamed來加載我的視圖層次結構。如何使用NSBundle加載幾個nib文件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,視圖只包含自己的筆尖文件,我怎麼弄super的呢?

我試圖將調用返回的對象插入到NSBundle,回到調用UIViewController自己的視圖層次結構中,但這並沒有解決,並且一些強制轉換問題阻止我能夠調試這個...

回答

5

您的示例中可能發生的情況是,在兩個nib文件中,您都設置了view Outlet。會發生什麼,然後是第二加載筆尖文件將覆蓋view屬性由第1筆尖文件中設置的值:

@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 

或者類似的規定。

+0

到底發生了什麼,我已經設法通過爲視圖層次結構的每個級別添加一個IBOutlet來實現它,可能會覺得有點不方便,但目前爲止我很滿意... – julien 2010-08-27 10:19:45

2

首先,我一般加載筆尖的東西,如以下內容,然後該控制器分配給它的父控制器的保持構件...

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

所以每個視圖控制器加載包含意見控制器。然後,你可能會或可能不會有明確的控制器視圖(myViewController.view)與將呼叫添加到父:

[window addSubview: myController.view]; 

你可能想看看蘋果的QuartzDemoUICatalog對代碼的一個例子負荷很多孩子查看控制器,儘管它將它添加到列表而不是視圖。

+0

我已經編輯我的問題,強調我在子類的情況,這會阻止我這樣做,是不是? – julien 2010-08-26 17:59:23

+0

如果保留myViewController屬性,則會導致內存泄漏。 – Jonny 2012-07-11 10:59:51

0

你真的不應該從loadView中的一個筆尖加載。重寫該方法的目的是以編程方式創建自己的視圖。你可以從標準init調用initWithNibName:,但這聽起來像是你想一起構成兩個視圖。我不認爲子類化會按照你想要的方式進行。您可以讓父視圖加載子視圖並將其視圖屬性添加到父視圖層次結構中。那是你想要做什麼?

相關問題