initWithNibName:@“ - VS-self.storyboard instantiateViewControllerWithIdentifier:@”?

时间:2013-12-18 10:01:31

标签: ios iphone objective-c xcode

我在做什么:

大家好,我正在学习iOS开发。我遇到了一个问题,我已经解决了。但是,我实际上并不知道发生了什么,它有效。 我正在从一本名为“Head first Iphone& amp; Ipad开发“(第2版)。本书是为Xcode 4和iOS4 Sdk编写的,而我则使用iOS 7编写Xcode 5。

目标:

我正在尝试创建一个新视图,我希望将其作为模态视图推送,以便用户填写新的饮料信息。

代码突破点:

@autoreleasepool 
{
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}

打破代码:

-(IBAction)addButtonPressed:(UIBarButtonItem *)sender
{
    DummyAddDrink *someDrink = [[DummyAddDrink alloc] initWithNibName:@"DetailViewController" bundle:nil];

    [self presentModalViewController:someDrink animated:YES];
}

工作代码:

-(IBAction)addButtonPressed:(UIBarButtonItem *)sender
{

  DummyAddDrink *someDrink = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"];[/u][/b]


[self presentModalViewController:someDrink animated:YES];
}

代码说明: addButtonPressed连接到“导航栏”中的“条形按钮项”。单击BBI时,它会调用aBP。 aBP通过从名为“DetailViewController”的现有控制器进行子类化来创建新视图。 DVC在IB中拥有自己的.h,.m,VC。

错误输出:

2013-12-18 09:57:02.735 DrinkMixer_Take_2[848:70b] NSBundle </Users/.../Library/Application Support/iPhone Simulator/7.0/Applications/408E0817-824B-40A6-   B1B2-34DDC8043712/DrinkMixer_Take_2.app> (loaded)
2013-12-18 09:57:37.105 DrinkMixer_Take_2[848:70b] *** Terminating app due to uncaught   exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle   </Users/.../Library/Application Support/iPhone Simulator/7.0/Applications/408E0817-824B-40A6-   B1B2-34DDC8043712/DrinkMixer_Take_2.app> (loaded)' with name 'DetailViewController''

问题:

为什么我的程序会破坏:

DummyAddDrink *someDrink = [[DummyAddDrink alloc] initWithNibName:@"DetailViewController" bundle:nil];

1 个答案:

答案 0 :(得分:2)

当您使用.xib创建viewController时,以及以这种方式处理视图时,将使用

initWithNibName。即使这样,除非绝对必要,否则你应该避免使用这种方法。

另一方面,instantiateViewControllerWithIdentifier是在使用故事板时创建新viewController的首选方式,在这种情况下,以前的方法不起作用。