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

时间:2011-12-15 22:52:38

标签: objective-c xcode cocoa-touch interface-builder ios5

我有一个包含2个属性的自定义UITableViewController

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

我的UIViewVenueHeaderViewController的{​​{1}}是在IB中设计的。这些控制器中的每一个都在其故事板中设置的子视图中有VenueFooterViewController个。这是我的故事板:

http://s3.amazonaws.com/luka/storyboard.png

我的问题是,我现在如何将IBOutletheader footer内的IBOutletUITableViewController和{{1}的实例相关联同时保留我在故事板中设置的布局和VenueHeaderViewController

1 个答案:

答案 0 :(得分:4)

您无法在故事板中的不同场景中连接IBOutlet。每个场景都是完全自包含的,并且只通过segue连接(或者在特殊容器视图控制器的情况下关联,如选项卡,导航,拆分视图和弹出控制器)。如果您在没有故事板的情况下完成了任何IB工作,请将每个场景(视图控制器)视为自己的笔尖(事实上,这就是故事板在幕后的作用)。

除此之外,通常情况下(至少在iPhone上)在视图控制器和UI的“屏幕”之间存在一对一的映射 - 您通常没有不同的视图控制器来管理不同的部分在屏幕上,您可以看到标题,表格和页脚的情况。 (因此,你几乎没有任何UIViewController子类的IBOutlet。)

那么可以你做什么?这里有一些不同的方法,从容易到难:

UITableView标题&页脚

如果您想要分配这些标题&页脚查看UITableView的{​​{1}}和tableHeaderView属性,您可以在IB的故事板中执行此操作 - 只需将某种类型的UIView从库中拖到顶部或在表的底部,直到您看到原型单元格上方或下方的蓝线:

drag view to table footer

表格标题&页脚视图可能会也可能不会是你所追求的:它们是表格滚动内容的一部分(也就是说,它们分别出现在第一行的上方和最后一行的下方,因此它们可以滚动到屏幕)。

以上观点&以下

如果您对这些视图的预期用途是“标题”和“页脚”,它们总是出现在表格的上方或下方,无论它在哪里滚动,那么您真正需要的是使用页眉,页脚和表视图都是根视图的子视图。

为此,您需要一个常规tableFooterView子类而不是UIViewController子类。您可以将UITableViewController作为该视图控制器根视图的子视图放入,并安排您希望在其上方/下方可见的任何其他视图。 (如果您打算支持轮换,请确保明智地设置自动调整。)以下是一个示例:

table view as subview

(如果您想知道第一次拖出表视图时原型单元格的位置,请检查检查器 - 您可以在该屏幕截图的右上角设置它们的数量。)

顶级视图

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

您也可以在故事板中执行此操作 - 将视图拖动到场景下方的黑条 - 但由于当前版本的Xcode中存在错误,您无法看到这些视图进行编辑。糟糕。

多个视图控制器,真的

如果以上都不符合您的需求,您可能仍然可以使用多个视图控制器 - 例如,如果您想在不同时间切换出不同的不同标题视图,并通过动态实例化这些视图层次结构来节省内存需要。像这样的情况非常罕见,但是......你应该先确定你已经用尽了其他选择。

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

在这种情况下,你拥有的故事板就是你想要的......这只是让这些视图控制器适当加载的问题,你可以这样做:

UIViewController

然后,从每个视图控制器中提取SpecialViewController *svc = [storyboard instantiateViewControllerWithIdentifier:@"SpecialViewController"]; 属性,将其插入“主”视图控制器的视图层次结构中,并丢弃从中提取的视图控制器。