您如何在Interface Builder故事板中跨场景连接IBOutlet?

lms*_*lms 4 xcode cocoa-touch objective-c interface-builder ios5

我有UITableViewController2个属性的自定义:

@property (strong, nonatomic) IBOutlet VenueHeaderViewController *header;
@property (strong, nonatomic) IBOutlet VenueFooterViewController *footer;
Run Code Online (Sandbox Code Playgroud)

UIView我第VenueHeaderViewControllerVenueFooterViewController设计的IB。每个IBOutlet情节提要在情节提要中设置了其子视图。这是我的故事板:

我的问题是,如何现在将我内部的header和连接footer IBOutlet到我UITableViewController的实例,VenueHeaderViewControllerVenueFooterViewController同时保留IBOutlet在情节提要中设置的布局和s?

ric*_*ter 5

您不能在情节提要中跨不同场景连接IBOutlets。每个场景都是完全独立的,并且仅通过segue(或在特殊容器视图控制器(如选项卡,导航,拆分视图和弹出菜单控制器)的关系)连接。如果您在没有情节提要的情况下完成了任何IB工作,请考虑将每个场景(视图控制器)都放在自己的笔尖中(实际上,这是情节提要在后台执行的操作)。

除此之外,通常(至少在iPhone上)在视图控制器和UI的“屏幕”之间存在一对一的映射-您通常没有不同的视图控制器来管理屏幕的不同部分,就像您拥有的页眉,表格和页脚一样。(因此,几乎没有任何子UIViewController类的IBOutlet 。)

那么,什么可以做什么?这是几种不同的方法,从简单到困难:

UITableView页眉和页脚

如果您打算将这些页眉和页脚视图分配给UITableViewtableHeaderViewtableFooterView属性,则可以在IB的情节提要中执行此操作-只需将某种UIView从库中拖到表的顶部或底部,直到您会在原型单元的上方或下方看到一条蓝线:

将视图拖到表格页脚

表格的页眉和页脚视图可能不是您想要的内容:它们是表格滚动内容的一部分(也就是说,它们分别显示在第一行的上方和最后一行的下方,因此可以在屏幕上滚动)。

上下视图

如果您打算将这些视图用作“页眉”和“页脚”,而无论它们在何处滚动,它们始终显示在表格的上方或下方,那么您真正需要的是将页眉,页脚和表格视图全部根视图的子视图。

为此,您将需要常规UIViewController子类而不是UITableViewController子类。您可以将UITableViewin作为该视图控制器的根视图的子视图放入,并排列希望在其上方/下方显示的其他任何视图。(如果打算支持旋转,请确保设置合理的自动调整大小。)这是一个示例:

表格视图作为子视图

(如果您想知道首次拖动表格视图时原型单元格在哪里,请检查检查器-您可以在屏幕截图的右上方设置它们的数量。)

顶级视图

使用常规笔尖(而不是情节提要),您可以在IB中设置不是视图控制器根视图的视图。然后,您仍然可以将插座连接到它们,并根据需要以编程方式将它们插入视图层次结构。

您也可以在情节提要中执行此操作-将视图拖动到场景下方的黑条中-但是由于当前版本的Xcode中存在错误,您无法查看这些视图进行编辑。哎呀。

真正的多视图控制器

如果以上都不满足您的需求,那么您可能仍然可以使用多个视图控制器-例如,如果您想在不同时间切换出不同的头文件视图,并通过根据需要动态实例化这些视图层次结构来节省内存。像这样的情况很少见,但是...您应该确保首先用尽其他选择。

实际上,您仍在使用前两种方法之一,但是所需的视图位于其他场景中(同样,它们位于其他笔尖中)。在这里,保存其他视图的视图控制器甚至不需要是的自定义子类UIViewController,因为它们只是要插入不同视图控制器的视图层次结构中的视图的临时容器。

在这种情况下,您拥有的情节提要就是您想要的...只是适当地加载了那些视图控制器即可,您可以这样做:

SpecialViewController *svc = [storyboard instantiateViewControllerWithIdentifier:@"SpecialViewController"];
Run Code Online (Sandbox Code Playgroud)

然后,view从每个视图控制器中拉出属性,将其插入“主”视图控制器的视图层次结构中,并处理从中拉出它的视图控制器。