6

我正在尝试如何将 nib 文件加载到UIViewController.

我创建了一个名为Email的单独 nib 文件。首先我注意到当视图控制器被加载时,该initWithNibName方法没有被调用。viewDidLoad所以我像这样手动从方法中调用它,

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

那没起效。我也收到了一个警告,说Expression result used

我在互联网上搜索并遇到了这篇文章并loadView按照描述的方法实现了这样的方法,

- (void)loadView
{
    [super loadView];

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

该方法被调用但视图控制器仍然是空的!

谁能告诉我我在这里忽略了什么以及如何做到这一点?

谢谢你。

更新:

首先,感谢所有回复。然而voromaxsvena的回答表明我应该删除 segues 并自动加载我不太喜欢的笔尖。Anil 的答案很有效,现在我还有最后一个障碍要跳。

我有多个笔尖文件。根据用户的选择,它应该加载一个特定的笔尖。所以我尝试的是,像这样把所有的笔尖放在数组中,

- (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'*

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

再次感谢。很抱歉有点拖了后腿。

4

3 回答 3

9

使用以下代码从 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]; 

将工作。

但这不好,根据用户选择加载单个笔尖

于 2013-04-05T07:59:52.823 回答
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;
}
于 2013-04-05T07:47:00.607 回答
1

您应该使用 nib 文件来实例化视图控制器本身,即

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

之后你可以展示这个控制器

更新

如果您需要选择应用程序逻辑应该加载哪个视图控制器,最好在一个故事板中创建所有视图控制器,跳过instantiateViewControllerWithIdentifier:故事板实例的硬 segue 绑定和使用方法来获取适当的视图控制器并呈现它手动。我假设您的表视图控制器已经在导航控制器中:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    if (APPROPRIATE_INDEX_PATH) {
        UIViewController *ctrl = [self.storyboard instantiateViewControllerWithIdentifier:IDENTIFIER];
        [self.navigationController pushViewController:ctrl animated:YES];
    }
}
于 2013-04-05T07:47:45.797 回答