2011-12-18 195 views
6

我有一个带有自定义节标题的tableview。节头的视图在故事板中定义并连线到实例变量。有没有办法从故事板中请求视图的新实例?从故事板中重用视图

在过去,我已经通过在其自己的XIB文件中定义节头并获得一个新的实例使用

[[NSBundle mainBundle] loadNibNamed:@"TimerViewSectionHeader" owner:self options:nil]; 
UIView *newHeaderView = self.sectionHeaderView; 

回答

3

我不”认为是有办法做到这一点做到了这一点。最好的办法是将tableview自定义标题视图放在一个单独的nib中,并在需要使用时像你在代码示例中那样加载它。

+0

+1 from me。我花了数小时试图弄清楚如何执行表格标题视图的Storyboard方式,因为我认为Storyboard是布局应用程序界面的新的改进方式。不幸的是,使用Storyboard无法在这个部门交付,最好的解决方案是回到以前的方式来为视图加载一个笔尖或者通过代码构建视图。我真的很想相信我的应用程序的所有UI都可以在一个Storyboard文件中完成,但事实绝非如此。 – ozz 2012-01-12 19:55:50

0

我已经能够在故事板中重用一个视图,只需将一个tableview的转换连接到我想要重用的视图。

所以我希望重用的tableview被指向两次。 它的工作,但我遇到它的问题,在我的应用程序委托中设置一个变量(使用instantiateViewControllerWithIdentifier)到我的表视图,正在得到重用。 看来,如果我重用它,故事板正在创建2个我的tableview实例,而我通过instantiateViewControllerWithIdentifier获得的实例并不是我想要的。

我不确定这是否是正确的方法。但我认为其他许多人正在以某种方式做这件事。使用故事板中的自定义表格单元格,我怀疑很多人想重复使用他们的视图。

3

我试图做同样的事情,并遇到同样的问题。

我喜欢与故事板一起工作,并留下深刻的印象,我可以创建一个工作用户界面的速度有多快。但是,只要您需要重新使用视图,将它们与UIViewController子类一起放入单独的笔尖中就很有意义。

然后,您可以将一个通用UIView在所有的地方,你再使用视图应该去使用你的ViewController添加视图:

[myReusableViewController loadView]; 
[myReusableViewController viewDidLoad]; // You have to handle view callbacks yourself. 

[self.myReusableViewPlaceholder addSubview:myResusableViewController.view]; 
[myReusableViewController viewWillAppear:YES]; 

所以总结起来:

  • 使用故事板,很棒
  • 在故事板中创建应用程序的脚手架以及任何静态视图(如关于屏幕等)
  • 在自定义笔尖中创建重用视图+ UIViewController子类,并在故事板中添加UIView占位符。

在另一个答案,我想到了一些Pros and Cons of Storyboard

+0

你确定你必须自己调用回调函数 - 对于我来说,看起来很怪异 – Rhubarb 2012-11-14 18:05:58

+0

然而,对于使用UIView作为占位符的想法,还是+1。请注意,您可以将它与上面的Krejko的答案结合起来,而不是从一个笔尖加载控制器,从故事板加载它(您可以使用一个故事板来保存一堆杂项视图) – Rhubarb 2012-11-14 18:07:30

+0

@Rhubarb我不是100%确定你必须自己做回调,但如果你嵌入视图,那么你有责任调用它,看起来。请注意,在iOS6.0中,有一种新机制可以使用Embed Segue将整个ViewController嵌入到当前视图控制器的某个区域中。这也可能是一个选项。 – Besi 2012-11-15 09:30:54

3

的解决方案,我想出了这个如下:

我有一个显示复杂数据的多个原型细胞的tableview。细节视图和事务处理视图有一个segue。

这第一个tableview有一个搜索按钮,显示一个新的tableview和结果。它需要与推动它的主桌面相同的功能;包括细节和交易进度视图如下:

在故事板上,选择并复制主桌面视图。取消选择并粘贴。从你的主tableview创建一个push segue到你的第二个tableview;或从任何你想从中导航的地方。根据需要修改第二个tableview。 IE:如果它需要一些UI更改没有问题。

创建一个新的viewcontroller类,它是运行主表视图的viewcontroller的子类。

覆盖子类中的数据委托来提供所需数据的子集。

回到故事板,选择你的第二个tableview控制器,并在身份检查器中选择你的子类作为自定义类。

为使此解决方案顺利运行,您的应用程序确实需要管理视图的数据。您可以使用prepareforsegue将数据从第一个tableview传递到第二个,但是从众多的角度来看,我发现应用程序数据模型更加灵活。

除非你有通过segue推送到子视图的按钮,否则你的子类将需要重载通过具有身份的segse推送的函数。注意:如果您身份证明的话,Segmentation必须有唯一的标识符。

弄清楚这一点需要花费大量的试验和错误,但是一旦你理解了这个概念,它就是一个相对平滑的解决方案,具有很强的适应性,并且不会太糟糕。

3

我不确定关于视图,但我能够将视图控制器从我的视频板中取出的方式如下。

UIViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"IdentifierName"]; 

从这里,也许你可能能够使用这种方式来类似于它曾经用过的笔尖。

+0

这应该被标记为正确的答案 – Yariv 2013-05-10 17:19:58