我正在尝试如何将nib文件加载到UIViewController
。
我创建了一个名为电子邮件的单独nib文件。首先我注意到,当加载视图控制器时,不会调用initWithNibName
方法。所以我就像这样手动从viewDidLoad
方法调用它,
[self initWithNibName:@"Email" bundle:[NSBundle mainBundle]];
它不起作用。此外,我收到一条警告,说表达结果未使用。
我在互联网上搜索并看到了this文章并按照如此描述的方式实施了loadView
方法,
- (void)loadView
{
[super loadView];
UINib *nib = [UINib nibWithNibName:@"Email" bundle:nil];
[nib instantiateWithOwner:self options:nil];
}
该方法被调用,但视图控制器仍为空!
有谁能告诉我我在这里忽略了什么以及如何做到这一点?
谢谢。
更新
首先,感谢所有回复。然而, voromax 和 svena 的答案表明我应该自动删除segues并加载笔尖,这些我不是很喜欢。 Anil的答案有效,现在我有最后一个跳跃的障碍。
我有多个nib文件。根据用户的选择,它应该加载一个特定的笔尖。所以我尝试的是,将所有的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'*
为什么会出现此错误?如果不可能,我愿意接受建议。
再次感谢。抱歉有点拖延这一点。
答案 0 :(得分:9)
使用以下代码从笔尖加载视图并用作视图控制器的视图
- (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];
会奏效。
但它不好,根据用户选择加载一个笔尖
答案 1 :(得分:1)
您不应该从该视图控制器的方法中为视图控制器加载一个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;
}
答案 2 :(得分:1)
您应该使用nib文件来实例化视图控制器本身i。即
UIViewController *ctrl = [[UIViewController alloc] initWithNibName:@"Email" bundle:nil];
之后你可以展示这个控制器
<强>更新强>
如果您需要选择应由应用程序逻辑加载哪个视图控制器,最好在一个故事板中创建所有视图控制器,跳过硬segue绑定并使用故事板实例的instantiateViewControllerWithIdentifier:
方法获取适当的视图控制器并手动显示。我假设您的表视图控制器已经在导航控制器中:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
if (APPROPRIATE_INDEX_PATH) {
UIViewController *ctrl = [self.storyboard instantiateViewControllerWithIdentifier:IDENTIFIER];
[self.navigationController pushViewController:ctrl animated:YES];
}
}