加载xib(nib)文件两次以获取视图的两个不同实例

时间:2010-07-22 18:56:35

标签: iphone uiviewcontroller xib

我有UIViewController* compViewController在同一视图的两个副本之间切换(两个视图之间的差异很小)。 目前,两个视图都来自同一个xib文件。 xib文件包含相同视图层次结构的两个几乎相同的副本。其中一个副本“主要的”连接到compViewController中的视图插座。 第二个视图连接到compViewController中的auxView插座。视图控制器选择显示一个或另一个视图。 实际上,这种描述过于简单化了实际情况。实际上,两个视图中的一个作为“overlayView”传递给UIImagePickerController,它由compViewController作为模态控制器推送。

这种方法最终成为维护的噩梦,因为对一个视图的任何更改都需要在笔尖中的另一个视图上进行复制。

我想的一种可能的解决方案是从nib中删除视图层次结构的一个副本,然后加载nib两次以获取视图的两个副本。然后在compViewController的viewDidLoad方法中以编程方式对其中一个进行必要的更改,然后将其作为叠加层传递给UIImagePickerController。

我在UIKit扩展类别中使用了针对NSBundle的loadNibNamed方法(我认为这是一个仅限iPhone的类别),它取得了所有者。如果所有者是相同的ViewController,则生成的对象是同一个对象,即为具有相同所有者的sam xib调用loadNibNamed两次返回相同的确切实例。我相信我需要两个单独的实例,因为过去我尝试将compViewController使用的视图的相同实例传递给ImagePicker,并且发生了各种不好的事情。我读到你应该永远不要在不同的UIViewContoller之间共享UI对象,至少不要将它们分别推送到同一个NavigationController中的ViewControllers。

我错过了更好的方法吗?

非常感谢您提出的任何建议。

1 个答案:

答案 0 :(得分:0)

我的理解是一个nib由一个viewController拥有,只能拥有一个所有者。我离开了笔尖,并开始在代码中构建所有内容。它在开始时需要更多的工作,但是当我发现笔尖限制时,它更具可重用性和强大功能。