需要帮助了解如何以编程方式添加IB创建的UIViews

时间:2010-01-15 08:26:03

标签: iphone objective-c cocoa-touch uikit interface-builder

我的情况是我的一个ViewControllers有很多特殊情况,我需要一种优雅的方式来处理它们。一般的想法是我的视图的下半部分在每种情况下是相同的。每个案例的上半部分都会发生变化。

根据DRY,如果我需要进行更改,我想避免为每个特殊情况制作ViewController的副本,并为每个ViewController更改底部的按钮。通常,我创建一个.xib,在IB中构建我的UI,并建立我的连接。我为屏幕的下半部分做了这个,它工作正常。

对于屏幕的上半部分,我分别创建了单独的UIView实例。我希望在ViewController出现之前动态加载它们(文档告诉我使用layoutSubviews,layoutIfNeeded和setNeedsLayout)。

这个设计提出的问题是我习惯于在IB中用我定义为IBOutlets的变量建立连接。我遵循在头文件中创建变量属性的模式,使它们成为属性,并在.m文件中使用“synthesize”。我也习惯于将UITextFields的代表设置为文件所有者,这样我就可以在键盘上重新设置他们的第一个响应者状态。

如果Interface Builder只允许我在给定视图中访问文件所有者和IBOutlets,如何在超级视图中访问这些动态添加它的属性?这里的设计是什么?

提前致谢!

2 个答案:

答案 0 :(得分:3)

看起来添加顶视图是视图控制器的业务。发送[super loadView]后,我会在控制器的-loadView中执行此操作。在运行时将两种方法连接在一起有两种方法。

  1. 以编程方式完成所有操作,包括分配子视图,设置代理等。
  2. 在同一个笔尖中创建所有顶视图,根据需要连接它们,并为每个顶视图添加一个插座到视图控制器。不要将任何顶视图放入IB的主视图中。这样,当控制器加载笔尖时,它会加载所有顶视图并正确工作,只需将正确的视图作为子视图安装到其主视图中。
  3. 您更喜欢哪种方法取决于您必须处理的顶级视图数量,在代码与IB中设置它们的难度以及应用程序加载具有大量视图的大型笔尖需要多长时间。

答案 1 :(得分:1)

您可以在不同的viewcontrollers中重用来自XIB的相同视图。您的XIB应包含单个根对象(视图,而不是控制器),可以从代码中加载和访问:

myView = [[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:nil options:nil] objectAtIndex:0];