[英]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];
}
該方法被調用,但視圖控制器仍為空!
任何人都可以告訴我我在這里看到了什么以及如何做到這一點?
謝謝。
更新:
首先,感謝所有的回復。 然而voromax和svena的答案表明我應該自動刪除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.