【问题标题】:Reusing view controller inside of scroll view. Swift iOS8 development在滚动视图中重用视图控制器。 Swift iOS8 开发
【发布时间】:2014-12-13 08:15:55
【问题描述】:

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

通常我喜欢就 Stack Overflow 提出更具体的问题,但经过数小时的研究后,我不知所措;非常感谢您的帮助!

【问题讨论】:

    标签: ios xcode swift storyboard


    【解决方案1】:

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

    如果以编程方式执行此操作,则在父控制器上调用 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 中执行此操作,则容易得多,只需将“容器视图”从“对象库”拖到父视图控制器的场景中即可:

    有关如何执行此操作的更多信息,请参阅视图控制器编程指南中的Implementing a Custom Container View Controller有关为什么执行这些包含调用以保持视图控制器层次结构很重要的讨论与视图层次结构同步,请参阅 WWDC 2011 视频Implementing UIViewController Containment


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

    【讨论】:

    • 谢谢!我目前正在查看您的参考资料并消化所有这些信息。从它的外观来看,虽然我应该能够在情节提要中创建一个具有我想要的布局的 ViewController,将该 ViewController 连接到 ScrollView 内的容器视图,然后以编程方式复制具有独特属性的原始 ViewController 以创建我的所有卡?
    • 如果以编程方式进行,您将“实例化”新的子视图控制器(如上所示),而不是“复制”。
    • 对!对不起,误会了。我完全理解 OOP 的概念和实例化一个类的实例以基于该类创建多个对象。我遇到的麻烦是了解如何在情节提要中创建该类,然后实例化该类的多个实例以填充我的滚动视图。看起来你让我走上了正确的道路。我正在观看您现在链接的视频以做好准备,然后我会尝试实施它。
    • 我相信你会明白的,但只需在 IB 中为你的新“卡片”视图创建一个场景。给这个场景一个自定义的故事板 ID。并将您的子视图控制器指定为这个新场景的基类。现在,当您instantiateViewControllerWithIdentifier 时,它会创建您的新视图控制器类的一个实例,并且它的视图和出口将就像您在 IB 中布置的一样。只需将这个新实例化的场景添加为孩子,如上所示。只需为添加到滚动视图的每个子视图重复该过程。我认为当你深入研究这一点时,一切都会“到位”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多