在故事板中,您不能将 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
属性,插入到您的“主”视图控制器的视图层级中,并且丢弃您提取的视图控制器。