从故事板重用视图

时间:2011-12-18 23:50:33

标签: iphone ios ipad uistoryboard

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

过去我通过在自己的xib文件中定义节头并使用

获取新实例来完成此操作
[[NSBundle mainBundle] loadNibNamed:@"TimerViewSectionHeader" owner:self options:nil];
UIView *newHeaderView = self.sectionHeaderView;

6 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

我喜欢在故事板上工作很多,并且对我创建工作UI的速度印象深刻。但是,只要您需要重新使用视图,将它们与其UIViewController子类一起放入单独的nib中就很有意义。

然后,您可以在重复使用的视图所在的所有位置放置通用UIView,并使用ViewController添加视图:

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

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

总结一下:

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

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

答案 2 :(得分:3)

我为此提出的解决方案如下:

我有一个包含多个原型单元格的tableview,可以显示复杂的数据。有详细视图的segue和事务处理视图。

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

在情节提要上,选择并复制主要的tableview。取消选择并粘贴。从主tableview到第2个tableview创建push segue;或者从哪里想要导航到它。根据需要修改第二个tableview。 IE:如果需要一些UI更改没问题。

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

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

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

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

除非您有通过segue推送到子视图的按钮,否则您的子类将需要覆盖通过带有标识的segue推送的函数。 NB Segues必须具有唯一标识符(如果您完全标记它们)。

需要花费大量的试验和错误来解决这个问题,但是一旦你理解了这个概念,它就是一个相对平稳的解决方案,具有很强的适应性,并且实现起来并不是那么糟糕。

答案 3 :(得分:3)

我不确定只是视图,但我能从故事板中获取视图控制器的方式如下。

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

从这里开始,也许你可以使用它与使用笔尖完成它的方式类似。

答案 4 :(得分:0)

我只能通过连接从一个tableview转换到我想要重用的那个视图来重用故事板中的视图。

所以我要重用的表视图指向两次。 它有点工作,但我遇到的问题是在我的app委托中设置一个变量(使用instantiateViewControllerWithIdentifier)到我的表视图,它被重用了。 似乎如果我重用它,故事板会创建我的tableview的2个实例,而我用instantiateViewControllerWithIdentifier获得的那个不是我想要的那个。

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

答案 5 :(得分:-1)

例如:我们要在下面显示的情节提要中重用该视图(包括子视图)。

The target view in storyboard we want to reuse

到目前为止,我所知道的最好的解决方案是将与视图相关的代码剪切并粘贴到New Singe View文件中,而不会丢失信息。

详细步骤如下

第1步:重命名我们要重用的视图。准备第二步。

step 1

第2步:打开情节提要作为源代码,以便剪辑所需的XML代码

step 2

第3、4步:搜索并裁剪所需的代码

step 3

step 4

步骤4.5(不需要):以Interface Builder的身份打开以查看已删除的视图

step 4.5

第5、6步:新建XXX.xib并粘贴我们刚才剪切的代码

step 5

step 6

第7步:重要。将代码<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>插入XXX.xib源代码。 警告:在将其作为Interface Builder打开之前,请执行此操作!否则,您将看到错误的尺寸和布局警告。

[![步骤7] [9]] [9]

第8步:新建XXX.swift以连接XXX.xib

[![步骤8] [10]] [10]

第9步:在所需位置添加视图

[![步骤9] [11]] [11]

我得到警告:“您至少需要10个信誉才能发布8个以上的链接。” 您可以支持我上传其余3张屏幕截图吗?