簡體   English   中英

在UIViewController中加載nib文件

[英]Loading a nib file inside a UIViewController

我正在試驗如何將nib文件加載到UIViewController

我創建了一個名為Email的獨立nib文件。 首先我注意到,當加載視圖控制器時,不會調用initWithNibName方法。 所以我像這樣手動從viewDidLoad方法調用它,

[self initWithNibName:@"Email" bundle:[NSBundle mainBundle]];

這沒用。 我還得到一個警告說表達結果未使用

我在互聯網上搜索並發現了這篇文章並實現了如下所述的loadView方法,

- (void)loadView
{
    [super loadView];

    UINib *nib = [UINib nibWithNibName:@"Email" bundle:nil];
    [nib instantiateWithOwner:self options:nil];
}

該方法被調用,但視圖控制器仍為空!

任何人都可以告訴我我在這里看到了什么以及如何做到這一點?

謝謝。

更新:

首先,感謝所有的回復。 然而voromaxsvena的答案表明我應該自動刪除segues和加載筆尖,我不是很喜歡。 Anil的答案有效,現在我有最后一個跳躍的障礙。

我有多個nib文件。 根據用戶的選擇,它應該加載一個特定的筆尖。 所以我嘗試的是,把所有的筆尖都放在數組里面,

- (void)loadView
{
    [super loadView];

    NSArray *nibs = [[NSArray alloc] initWithObjects:
                     [[NSBundle mainBundle] loadNibNamed:@"Facsimile" owner:self options:nil],
                     [[NSBundle mainBundle] loadNibNamed:@"Email" owner:self options:nil],
                     [[NSBundle mainBundle] loadNibNamed:@"Memorandum" owner:self options:nil],
                     [[NSBundle mainBundle] loadNibNamed:@"ProjectMemo" owner:self options:nil], nil];


    self.view = [nibs objectAtIndex:0];
}

並使用其索引訪問它,如self.view = [nibs objectAtIndex:1]; 但它會拋出錯誤*由於未捕獲的異常'NSInvalidArgumentException'終止應用程序,原因:' - [__ NSArrayM _setViewDelegate:]:無法識別的選擇器發送到實例0xd56fd20'*

為什么會出現這個錯誤? 如果不可能,我願意接受建議。

再次感謝。 抱歉有點拖延這一點。

使用以下代碼從nib加載視圖並用作視圖控制器的視圖

- (void)loadView
{ 
[super loadView];

NSArray *nib =[[NSBundle mainBundle]loadNibNamed:@"test" owner:self options:nil];
self.view = [nib objectAtIndex:0];
}  

編輯

根據用戶選擇加載單個筆尖。 請參閱加載單個筆尖

    NSArray *nib =[[NSBundle mainBundle]loadNibNamed:@"test" owner:self options:nil];  

將返回一個對象數組。 從您更新的問題我可以看到您將這些數組存儲到另一個數組中。 現在你的nib數組是一個'array'對象的數組。

 self.view = [[nibs objectAtIndex:0]objectAtIndex:0]; 

將工作。

但它並不好,根據用戶選擇加載一個筆尖

您不應該從該視圖控制器的方法中為視圖控制器加載一個nib。

如果要從nib實例化視圖控制器,可以從該視圖控制器外部執行此操作,通常是顯示它的視圖控制器。

如果您正在尋找已經設置了插座連接的呈現視圖控制器內的掛鈎,則覆蓋-awakeFromNib是一種流行的選擇。 -viewDidLoad是另一個。

更新#1

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
   if ( /*do your segue identification stuff*/ ) {
      UIViewController *myViewController = /*init your view controller here*/
      UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:myViewController];
      [self presentViewController:navigationController animated:YES completion:nil];
      return NO;
   }
   return YES;
}

您應該使用nib文件來實例化視圖控制器本身,即

UIViewController *ctrl = [[UIViewController alloc] initWithNibName:@"Email" bundle:nil];

之后,您可以呈現此控制器

更新

如果您需要選擇應由應用程序邏輯加載哪個視圖控制器,最好在一個故事板中創建所有視圖控制器,跳過硬segue綁定並使用instantiateViewControllerWithIdentifier: storyboard實例的方法來獲取相應的視圖控制器和手動呈現。 我假設你的表視圖控制器已經在導航控制器中:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    if (APPROPRIATE_INDEX_PATH) {
        UIViewController *ctrl = [self.storyboard instantiateViewControllerWithIdentifier:IDENTIFIER];
        [self.navigationController pushViewController:ctrl animated:YES];
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM