如何在Interface Builder的Storyboard中连接跨场景的IBOutlets?

4

我有一个自定义的UITableViewController,其中包含两个属性:

@property (strong, nonatomic) IBOutlet VenueHeaderViewController *header;
@property (strong, nonatomic) IBOutlet VenueFooterViewController *footer;

我的 VenueHeaderViewControllerVenueFooterViewControllerUIView 是在 IB 中设计的。这些控制器中的每一个都有对其子视图的 IBOutlet 进行设置。这是我的故事板:

我的问题是,如何在保留我在故事板中设置的布局和 IBOutlet 的情况下,将我的 UITableViewController 中的 headerfooterIBOutlet 连接到我的 VenueHeaderViewControllerVenueFooterViewController 实例上?
1个回答

5
在故事板中,您不能将 IBOutlets 直接连接到不同场景。每个场景都是完全独立的,只通过 segue(或者在特殊容器视图控制器(如标签、导航、分割视图和弹出窗口控制器)的情况下使用关系)进行连接。如果您在没有故事板的情况下完成了任何 IB 工作,请将每个场景(视图控制器)视为其自己的 nib(事实上,这就是故事板在幕后执行的操作)。
除此之外,在 iPhone 上通常情况下,一个视图控制器与 UI 中的一个“屏幕”之间存在一对一的映射,因此您通常不会有不同的视图控制器来管理屏幕的不同部分,正如您所拥有的标题、表格和页脚一样。(因此,您几乎永远不会有任何UIViewController子类的IBOutlet。)
那么你可以做些什么呢?以下是从简单到困难的几种不同方法:

UITableView header & footer

如果您的意图是将 header 和 footer 视图分配给 UITableView 的 tableHeaderView 和 tableFooterView 属性,则可以在 IB 的故事板中执行此操作 - 只需从库中拖动某种 UIView,直到您看到原型单元格(s)的上方或下方出现蓝色线:
表头和页脚视图可能与您想要的不同:它们是表格的滚动内容的一部分(也就是说,它们出现在第一行上面和最后一行下面,因此它们可以被滚动到屏幕之外)。

Views above & below

如果您打算将这些视图用作“标题”和“页脚”,因为无论表格向哪里滚动,它们始终出现在表格上方或下方,则您真正需要的是将标题、页脚和表格视图都作为根视图的子视图。
为此,您需要一个常规的 UIViewController 子类,而不是 UITableViewController 子类。您可以将 UITableView 作为该视图控制器的根视图的子视图,并排列任何其他要在其上/下可见的视图。(如果计划支持旋转,请确保合理设置自动调整大小。)以下是示例:
(如果您想知道首次拖出表视图时原型单元格在哪里,请检查检查器 - 您可以在该截图的右上角设置它们的数量。)

Top level views

对于常规的nibs(非storyboards),您可以在IB中设置视图,这些视图不是视图控制器的根视图。然后,您仍然可以将插座连接到它们,并根据需要以编程方式将它们插入视图层次结构中。

在storyboard中,您也可以这样做--将视图拖动到场景下方的黑色条中--但由于Xcode当前版本中的一个错误,您无法查看这些视图以进行编辑。糟糕。

多个视图控制器

如果上述方法都不适用于您的需求,您可能仍然需要使用多个视图控制器--例如,如果您想在不同时间切换不同的标题视图,并通过根据需要动态实例化这些视图层次结构来节省内存。尽管这种情况很少见...您应该确保首先耗尽其他选项。

实际上,您仍然在使用前两种方法之一,但您想要的视图位于其他场景中(再次,就像它们位于其他nibs中)。在这种情况下,持有其他视图的视图控制器甚至不需要是UIViewController的自定义子类,因为它们只是临时容器,用于插入到不同视图控制器的视图层次结构中的视图。

在这种情况下,您需要的是现有的storyboard...只需正确加载这些视图控制器即可,方法如下:

SpecialViewController *svc = [storyboard instantiateViewControllerWithIdentifier:@"SpecialViewController"];

然后,从每个视图控制器中提取view属性,插入到您的“主”视图控制器的视图层级中,并且丢弃您提取的视图控制器。


不同选项的一个很好的总结。“但由于当前版本的Xcode中存在一个错误,您无法查看这些视图以进行编辑。糟糕。”鉴于在Xcode 4.6中仍然存在这种情况,您上面提到的最后一个选项似乎是“苹果推荐”的方法 - 或者是否有更好的方法来实现类似于单独的xib文件的工作方式? - theLastNightTrain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接