2010-01-15 38 views
4

我处于一种情况,其中一个ViewController有很多特殊情况,我需要一种处理它们的优雅方式。总体思路是我的View的下半部分在每种情况下都是相同的。 上半部分针对每种情况进行了更改。需要帮助了解如何以编程方式添加IB创建的UIViews

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

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

这个设计呈现的问题是我习惯于在IB中与我定义为IBOutlets的变量进行连接。我遵循头文件中的变量属性模式,使它们成为属性并使用.m文件中的“合成”。我也习惯于将UITextField的委托设置为文件所有者,这样我就可以在键盘上辞去他们的第一个响应者状态。

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

在此先感谢!

回答

3

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

  1. 做整个程序,包括分配子视图,设置代表等
  2. 创建在同一笔尖所有的俯视图,将它们连接根据需要添加一个出口为每顶视图到您的视图控制器。不要在IB的主视图中放置任何顶级视图。这样,当控制器加载笔尖时,它将加载所有顶部视图并正确工作,只需将正确的视图安装到其主视图的子视图中即可。

你喜欢哪种方法取决于你必须处理多少顶视图,在代码和IB中设置它们有多困难,以及你的应用需要多长时间才能将很多视图加载到一个大的笔尖上。

1

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

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