在UIViewController中加载nib文件

时间:2013-04-05 07:37:38

标签: ios uiviewcontroller xib nib

我正在尝试如何将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'*

为什么会出现此错误?如果不可能,我愿意接受建议。

再次感谢。抱歉有点拖延这一点。

3 个答案:

答案 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];
    }
}