在滚动视图中重复使用视图控制器。Swift iOS8开发

7
在Xcode6中使用Swift for iOS8,我需要创建一个滚动视图来滚动动态创建的卡片。这些卡片包含自己独特的图片、文本和按钮功能,但具有相同的布局。我不知道如何在Storyboard中创建可重用的视图控制器,从而可以构建每个卡片,然后将它们全部嵌入到滚动视图容器中,以便我可以逐个滑动它们。
通常情况下,我喜欢在Stack Overflow上提出更具体的问题,但经过数小时的研究,我束手无策;非常感谢您的帮助!
1个回答

12

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

如果是以编程方式实现,您需要在父控制器上调用addChildViewController(从而将子视图控制器添加到视图控制器层次结构中),对子视图执行所有配置(包括将其添加到父控制器的视图层次结构中),最后,在子视图上调用didMoveToParentViewController

let child = storyboard!.instantiateViewController(withIdentifier: "storyboardIdForChildScene")
addChild(child)
child.view.frame = .zero
scrollView.addSubview(child.view)
child.didMove(toParent: self)

如果要以编程方式移除视图控制器,需要反向进行此过程,即在子视图上调用willMoveToParentViewController:nil,从其父视图中移除子视图,并在完成所有操作后调用removeFromParentViewController

child.willMove(toParent: nil)
child.view.removeFromSuperview()
child.removeFromParent()

如果在Interface Builder中进行此操作,那么就更容易了,只需从“对象库”中将“容器视图”拖到父视图控制器的场景中:

container view

有关如何执行此操作的更多信息,请参见“视图控制器编程指南”中的实现自定义容器视图控制器。有关为什么重要进行这些包含调用以使视图控制器层次结构与视图层次结构同步的讨论,请参见WWDC 2011视频实现UIViewController包容性


以上内容适用于Swift 4。对于早期的Swift版本,请参见此答案的先前修订版本


谢谢!我正在查看您提供的参考资料,并消化所有这些信息。从外观上看,我应该能够在Storyboard中创建一个具有所需布局的ViewController,将该ViewController连接到ScrollView内部的容器视图,然后以编程方式复制具有唯一属性的原始ViewController以创建所有卡片? - madeFromCode
如果以编程方式实现,您将“实例化”新的子视图控制器(如上所示),而不是“复制”。 - Rob
好的!抱歉,我说错了。我完全理解面向对象编程(OOP)的概念和实例化类的概念,以便基于该类创建多个对象。我遇到的问题是不知道如何在Storyboard中创建该类,然后实例化多个该类的实例来填充我的滚动视图。看起来你已经为我指明了正确的方向。我正在观看你提供的视频,准备好之后我会尝试实现它。 - madeFromCode
1
我相信你能够搞定,只需要在IB中为你的新“卡片”视图创建一个场景。给这个场景一个自定义的Storyboard ID,并将你的子视图控制器指定为这个新场景的基类。现在,当你使用instantiateViewControllerWithIdentifier时,它会创建一个你的新视图控制器类的实例,它的视图和输出将与你在IB中布局的一样。只需像上面展示的那样将这个新实例化的场景添加为子视图即可。对于你添加到滚动视图中的每个子视图,只需重复这个过程。我认为当你深入研究时,一切都会“水到渠成”。 - Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接