Isu*_*uru 6 xib uiviewcontroller nib ios
我正在试验如何将nib文件加载到UIViewController.
我创建了一个名为Email的独立nib文件.首先我注意到,当加载视图控制器时,该initWithNibName方法不会被调用.所以我viewDidLoad像这样手动调用方法,
[self initWithNibName:@"Email" bundle:[NSBundle mainBundle]];
Run Code Online (Sandbox Code Playgroud)
那没起效.我还得到一个警告说表达结果未使用.
我在互联网上搜索并发现了这篇文章并实现了loadView如下所述的方法,
- (void)loadView
{
[super loadView];
UINib *nib = [UINib nibWithNibName:@"Email" bundle:nil];
[nib instantiateWithOwner:self options:nil];
}
Run Code Online (Sandbox Code Playgroud)
该方法被调用,但视图控制器仍为空!
任何人都可以告诉我我在这里看到了什么以及如何做到这一点?
谢谢.
更新:
首先,感谢所有的回复.然而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];
}
Run Code Online (Sandbox Code Playgroud)
并使用它的索引访问它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];
}
Run Code Online (Sandbox Code Playgroud)
编辑
根据用户选择加载单个笔尖.请参阅加载单个笔尖
NSArray *nib =[[NSBundle mainBundle]loadNibNamed:@"test" owner:self options:nil];
Run Code Online (Sandbox Code Playgroud)
将返回一个对象数组.从您更新的问题我可以看到您将这些数组存储到另一个数组中.现在你的nib数组是一个'array'对象的数组.
self.view = [[nibs objectAtIndex:0]objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)
将工作.
但它并不好,根据用户选择加载一个笔尖
您不应该从视图控制器的方法中加载视图控制器的笔尖。
如果您想从 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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11888 次 |
| 最近记录: |