在故事板中将UIViewController xib加载到ContainerView

时间:2012-12-27 12:22:24

标签: iphone objective-c ios xcode uistoryboard

我有一个“容器”viewController,它使用storyboard保存一些容器视图。 每个容器视图都有一个指向嵌入式viewcontroller视图的链接。

由于我正在开展一个大项目,事实证明,故事板文件非常庞大,并且包含许多“子”视图控制器视图布局。当一些人需要同时在其上工作时,处理该文件将是一个问题。这对我不利。 我想知道是否有一种方法可以加载到每个容器中查看一个viewcontroller的xib文件,并且仍在使用storyboard。

意思是,为每个viewcontroller创建.xib文件,而不是将它们保存在storyboard本身中,并将它们链接到storyboard中的容器视图。

感谢,

2 个答案:

答案 0 :(得分:14)

可以将视图控制器布局移动到单独的xib中。正如您所说,这是跨故事板共享布局的一种非常方便的方式。

在故事板中设置容器视图时,请确保删除嵌入的ViewController中提供的视图。将ViewController的自定义类设置为您的类名。将xib命名为与类匹配(例如,FooViewController.xib,以便在加载FooViewController.m时找到它。)

如果您没有删除故事板视图控制器布局中的视图,则会看到该视图。您的视图控制器中的viewDidLoad方法无法调用,因为视图是默认的故事板视图。

我在iOS 7之前的项目中使用Xcode 6.1 for iOS 8。

答案 1 :(得分:5)

是的,你可以。一些观察结果:

  1. 您需要做的就是输入我们在使用NIB时常用的代码。对于容器,这意味着the typical container methods。如果您还没有通过代码进行遏制,请参阅 View Controller Programming Guide。底线中的Creating Custom Container View Controllers,当您转换到非故事板场景时(或添加非故事板的子项)查看控制器),只需像在NIB环境中一样习惯。您无法在故事板中表示此基于NIB的场景。但是你只需像使用NIB那样得到控制器:

    SecondViewController *controller = [[SecondViewController alloc] initWithNibName:nil bundle:nil];
    
  2. 您显然失去了使用故事板的许多好处(例如,根据父场景中的容器视图调整子场景的大小),但您并没有比在NIB环境中更糟糕。但是,在回答您是否可以“将它们链接到故事板中的容器视图”这一问题时,您无法在故事板本身中表示这种关系,而是以编程方式将它们链接起来。

  3. 如果您的单独团队在单场景环境中工作,则可以使用此NIB方法。不过,您还应该考虑使用多个故事板,每个逻辑团队一个。在故事板之间转换时,您仍然需要使用代码,就像在此NIB方法中一样,但如果您的某个团队有多个场景要处理,他们可以在项目的各个部分享受故事板优势。当您想要到达下一个故事板中的第一个场景时,您可以:

    UIStoryboard *secondaryStoryboard = [UIStoryboard storyboardWithName:@"SecondStoryboard" bundle:nil];
    SecondViewController *controller = [secondaryStoryboard instantiateInitialViewController];
    
  4. 如果您的孩子需要转换到故事板上的新场景,我发现将自己的parentStoryboard属性添加到我的子控制器非常有用,如果您需要做某些事情,它可能会很有用比如instantiateViewControllerWithIdentifier。显然,如果你没有转换到新的控制器,你可能不需要这样做,但如果你这样做,拥有UIStoryboard属性可能会有用。