Ios 在滚动视图中重用视图控制器。快速发展

Ios 在滚动视图中重用视图控制器。快速发展,ios,xcode,swift,storyboard,Ios,Xcode,Swift,Storyboard,使用Xcode6中的Swift for iOS8,我需要创建一个滚动视图,该视图将滚动浏览动态创建的卡。这些卡片包含自己独特的图像、文本和按钮功能,但布局相同。我很难理解如何在故事板中创建一个可重用的视图控制器,从中我可以构建每张卡,然后将它们全部嵌入到滚动视图容器中,这样我就可以一次浏览一张 通常我喜欢问更多关于堆栈溢出的具体问题,但经过数小时的研究,我不知所措;非常感谢您的帮助 您正在寻找自定义容器视图控制器 如果以编程方式执行此操作,则在父控制器上调用addChildViewControl

使用Xcode6中的Swift for iOS8,我需要创建一个滚动视图,该视图将滚动浏览动态创建的卡。这些卡片包含自己独特的图像、文本和按钮功能,但布局相同。我很难理解如何在故事板中创建一个可重用的视图控制器,从中我可以构建每张卡,然后将它们全部嵌入到滚动视图容器中,这样我就可以一次浏览一张


通常我喜欢问更多关于堆栈溢出的具体问题,但经过数小时的研究,我不知所措;非常感谢您的帮助

您正在寻找自定义容器视图控制器

如果以编程方式执行此操作,则在父控制器上调用
addChildViewController
(从而将子视图控制器添加到视图控制器层次结构),执行子视图的所有配置(包括将其添加到父控制器的视图层次结构),然后在最后,在子系统上调用didMoveToParentViewController:

let child = storyboard!.instantiateViewController(withIdentifier: "storyboardIdForChildScene")
addChild(child)
child.view.frame = .zero
scrollView.addSubview(child.view)
child.didMove(toParent: self)
以编程方式删除时,可以反转此过程,在子视图上调用
将移动到ParentViewController:nil
,从其superview中删除子视图,完成后,调用
从ParentViewController中删除

child.willMove(toParent: nil)
child.view.removeFromSuperview()
child.removeFromParent()
如果在Interface Builder中执行此操作,则更简单,只需将“容器视图”从“对象库”拖动到父视图控制器的场景:

有关如何执行此操作的详细信息,请参见《视图控制器编程指南》中的。有关为什么执行这些包含调用以保持视图控制器层次结构与视图层次结构同步很重要的讨论,请参阅WWDC 2011视频



以上内容适用于Swift 4。有关早期Swift版本,请参阅。

谢谢!我目前正在查阅你的参考资料并消化所有这些信息。从外观上看,虽然我应该能够在故事板中创建一个具有我想要的布局的ViewController,但将该ViewController连接到ScrollView内部的容器视图,然后以编程方式复制具有唯一属性的原始ViewController以创建我的所有卡片?如果以编程方式进行,您将“实例化”新的子视图控制器(如上图所示),而不是“复制”“.对!对不起,说错了。我完全理解OOP的概念,并实例化一个类的实例以基于该类生成多个对象。我遇到的麻烦是理解如何在故事板中创建该类,然后实例化该类的多个实例以填充我的滚动视图。看来你让我走上了正确的道路。我正在看你链接到我自己准备的视频,然后我将尝试实现它。我相信你会明白的,但只需在IB中为你的新“卡”视图创建一个场景。为该场景指定自定义情节提要id,并指定子视图控制器作为该新场景的基类。现在,当您
实例化eviewcontrollerwhidentifier
时,它将创建新视图控制器类的实例,其视图和出口将与您在IB中的布局相同。只需将此新实例化的场景作为子对象添加,如上所示。只需对添加到滚动视图的每个子视图重复该过程。我认为,当你深入研究这一点时,一切都会“到位”