将 UIViewController 添加到 UICollectionViewCell

Posted

技术标签:

【中文标题】将 UIViewController 添加到 UICollectionViewCell【英文标题】:Add UIViewController to UICollectionViewCell 【发布时间】:2018-06-03 10:47:47 【问题描述】:

我阅读了很多 ***,但我不知道该怎么做。

我想将UIViewController 添加到具有四个不同单元格的UICollectionViewCell 中,其中一个单元格的视图非常复杂,并且数据不断变化,因此我想在此视图中添加一个控制器。

我不知道如何将UIViewController 添加到单元格中,因为没有addChildViewController

我的视图控制器:

class ViewController1: UIViewController 


    override func viewDidLoad() 
        super.viewDidLoad()
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
    


我的 CollectionViewCell:

class CollectionViewCell1: UICollectionViewCell 


    lazy var viewController: ViewController1 = 
        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let vc = storyboard.instantiateViewController(withIdentifier: "ViewController1") as! ViewController1
        return vc
    ()

    override init(frame: CGRect) 
        super .init(frame: frame)
        print("Initiatetd")
        setUpViews()


    

    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been impemented")
    

    func setUpViews() 
        addSubview(viewController.view)
        let views: [String: Any] = ["viewController": viewController]
        addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[viewController]|", options: [], metrics: nil, views: views))
        addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-[viewController]-|", options: [], metrics: nil, views: views))
    

我收到此错误:

由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'-[App.视图控制器1 nsli_superitem]:发送到实例的无法识别的选择器 0x7fb08df28ea0'

【问题讨论】:

错误发生在哪一行?添加异常断点以查找导致崩溃的代码行。 感谢您在我想将其添加为子视图时回答 【参考方案1】:

您不能将视图控制器添加到这样的单元格中。为了做你想做的事,你需要使用容器视图。文档说:

容器视图在视图控制器的视图子图中定义了一个区域,该区域可以包含子视图控制器。

只需将容器视图添加到您的单元格(来自 Storyboard)。

要将容器视图连接到您的视图控制器(其中有单元格),您需要创建一个嵌入转场。要将数据发送到 prepare(forSegue:) 中的视图控制器,请检查目标并执行所需操作。

【讨论】:

我无法真正弄清楚,我通常以编程方式完成所有操作。但我试图在故事板中做到这一点,但 Xcode 告诉我我不能将容器视图放在可重用的单元格中。基本上我必须在单元格中创建一个容器视图并在我的父控制器中创建一个 segue 并在那里加载 vc 控制器并通过 segue 将其发送到内容单元格? @PaFi,老实说,我没有尝试以编程方式创建容器视图,但是当您在界面生成器中执行此操作时,Xcode 会创建一个 segue(带有一个单独的窗口,在容器视图)。当然,它的类型是 UIViewController 但你可以创建一个子类或像使用任何普通的 View Controller 一样更改它的类型。为了向它发送数据,在prepare(forSegue:) 方法中,您只需检查目的地(不需要segue id)。另外,您的集合视图是否仅包含四个单元格? 是的,它只有四个单元格,但我现在让它工作了。我是这样做的:khanlou.com/2015/04/view-controllers-in-cells 我正在创建一个 uiviewcontroller 数组,并通过 uicollectionviewdatasource 推送 viewcontroller 的视图

以上是关于将 UIViewController 添加到 UICollectionViewCell的主要内容,如果未能解决你的问题,请参考以下文章

将 UIViewController 的 UI 扩展到子 UIViewControllers

必须使用延迟实例化的UI视图将子视图添加到视图控制器两次

UIViewController 的视图没有出现在 UIPopoverController 中

将 UIViewController 的视图添加到另一个 UIViewController 的视图是不是可取?

从父 UIViewController 类继承 UI 组件?

如何将 UIViewController 作为子视图添加到 UIViewController(RootViewController)?