在UIViewController中加载一个nib文件

问题描述:

我在试验如何将nib文件加载到UIViewController在UIViewController中加载一个nib文件

我创建了一个单独的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]; 
} 

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

有人可以告诉我我在这里忽略什么以及如何做到这一点?

谢谢。

UPDATE:

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

我有多个笔尖文件。根据用户的选择,它应该加载特定的笔尖。因此,我试过了,把所有的碎粒数组里面像这样,

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

您还没有提到你的问题的故事板和定制逻辑,不是每个人都会阅读所有评论...查看更新的答案 – voromax 2013-04-05 12:16:15

您不应该从该视图控制器的方法内为视图控制器加载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; 
} 
+0

有一个'UITableViewController'作为前一个视图控制器,所以我试图在发生segue之前实例化它时加载nib。 'NewMailViewController * newMailVC = [[NewMailViewController alloc] initWithNibName:@“Email”bundle:nil]; newMailVC = [segue destinationViewController];'但它没有奏效。 – Isuru 2013-04-05 08:56:27

+1

从您的评论我断定你正在使用故事板。故事板会为您实例化您的视图控制器,并且您不会自己加载这些笔尖。是否有一个原因,你想回到使用故事板从笔尖加载? – svena 2013-04-05 09:28:11

+0

是的,我正在使用故事板。对不起,我应该在问题中提到这一点。情景就是这样。我正在创建一个自定义邮件应用程序,并且有多种邮件类型。对于每种邮件类型,UI是不同的。所以我做的是,为每个邮件类型创建一个单独的nib,有一个'UITableViewController'来列出邮件类型以及什么时候邮件的类型,这取决于用户的选择,它将特定的nib文件加载到'UIViewController'。 – Isuru 2013-04-05 10:03:39

你应该用笔尖文件实例化视图控制器本身我。即

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]; 
    } 
} 
+0

有一个'UITableViewController'作为前一个视图控制器,因此我试图在实例化它之前发生segue时加载nib。 'NewMailViewController * newMailVC = [[NewMailViewController alloc] initWithNibName:@“Email”bundle:nil]; newMailVC = [segue destinationViewController];'但它没有奏效。 – Isuru 2013-04-05 08:57:16

+1

你可以通过' - shouldPerformSegueWithIdentifier取消这个segue:sender:'返回NO并手动加载你的控制器 – voromax 2013-04-05 09:07:23

使用下面的代码从笔尖加载视图和视图控制器的视图中使用

- (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数组是一个'数组'对象的数组。

self.view = [[nibs objectAtIndex:0]objectAtIndex:0]; 

将工作。

但它是不好的,根据用户的choise加载一个笔尖

+0

感谢你的回应。这种方法有效,我有一个问题。我有多个笔尖文件。根据用户的选择,它应该加载特定的笔尖。所以我试着把所有的nib都放在数组里,像[this](http://pastebin.com/rcpHTTSY),并使用它的索引来访问它'self.view = [nibs objectAtIndex:1];'。但它会抛出一个错误_终止应用程序由于未捕获的异常'NSInvalidArgumentException',原因:' - [__ NSArrayM _setViewDelegate:]:无法识别的选择器发送到实例0xd56fd20'_我缺少的东西还是有另一种方式去呢? – Isuru 2013-04-05 10:09:50

+0

你可以发布你的代码和问题吗?我无法访问该页面。实际上,由__loadNib__返回的nib数组不仅包含视图s,还包含nib中的所有控件(buttons/label ..)objectAtIndex [0]将是*对象(如果您有单个视图,最有可能是视图)笔尖)。看不到你的代码我不能说确切的问题 – 2013-04-05 10:23:21

+0

我更新了我的问题上面。 – Isuru 2013-04-05 10:43:28