无法将 collectionView 插座添加到 nib 中的 UICollectionViewController

Posted

技术标签:

【中文标题】无法将 collectionView 插座添加到 nib 中的 UICollectionViewController【英文标题】:Cannot add collectionView outlet to UICollectionViewController in nib 【发布时间】:2016-06-09 12:25:03 【问题描述】:

我正在尝试以下列方式实例化 UICollectionViewController

class ViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()
        UINib(nibName: "TestController", bundle: nil).instantiateWithOwner(nil, options: nil)
    

我的笔尖叫做TestController.xib,包含一个UICollectionViewController,其中包含一个UICollectionView。当我在笔尖内添加一个插座collectionViewUICollectionViewControllerUICollectionView 时,上面的行会引发以下错误:

'NSInvalidArgumentException', reason: 'Can't add self as subview'

我的想法可能有错误,但我无法弄清楚为什么会发生这个错误。

这是我的笔尖:

编辑:

当我不在笔尖中添加任何插座时,错误就会消失。但是我的UICollectionViewController 中的collectionViewnil,就像这样:

public class MyCollectionViewController: UICollectionViewController 

    override public func viewDidLoad() 
        super.viewDidLoad()

        //unwrapping error!
        self.collectionView!.backgroundColor = UIColor.blueColor() 
    
 

我该如何解决这个问题?

编辑 2:

我在这个简单的 xcode 项目中重现了错误:https://github.com/Damnum/ReproduceControllerBug

【问题讨论】:

你能添加一些代码吗?这将有助于社区。​​span> 您说“当我在 nib 内添加一个从 UIViewController 到 CollectionView 的 segue collectionView 时......”这没有任何意义。 UICollectionViewController 创建和管理集合视图(仅此而已)。如果您的 nib 定义了 UICollectionViewController,则不适用 segue。另外,segues 是 Storyboard 的功能,而不是 nib。编辑您的问题以显示您的代码,并可能显示 nib 布局的屏幕截图。 如果你使用UICollectionViewController,collectionView是自动outlet,不要拖动Outlet。 因为 UICollectionVIewController 已经添加了 UICollectionView ,所以不需要为 UICollectionView 添加 outlet @IyyappanRavi 和 Saurabh:当我不拖动插座时,UICollectionViewController 内的 collectionView 属性在 viewDidLoad() 中为零。这就是我创建插座的原因。还是有别的办法? 【参考方案1】:

发生这种情况的原因是,尽管 Interface Builder 将该控制器显示为 UICollectionViewController,但到 collectionView 的内部魔术链接已损坏。原因包括

它被创建为不同的控制器类型,并且类被重命名为 UICollectionView 它是作为 UICollectionView 创建的,但该类被编辑为 IB 识别的其他内容,然后重新编辑 有人在你背后编辑了 XML 源代码。在积极编辑的同时恢复版本控制? IB 崩溃、困惑或只是感到暴躁

但正如人们所指出的,在正确构造的 nib 中,collectionView 绝对会在 viewDidLoad 时被填充。所以如果不是,我建议拖出一个新的控制器实例并将其扔掉。这几乎肯定会比试图弄清楚这个管道是如何以及为什么坏了要快。

编辑:

直到老式的 nib 范式在 Swift 中不起作用。谁知道?不是我,自从 Swift 诞生以来,我只使用故事板。对于遇到相同问题的人,如何正确加载 UICollectionView 子类作为您的主视图而无需情节提要is on Github here。

【讨论】:

非常感谢!我能够在一个极其简单的设置中重现该错误:github.com/Damnum/ReproduceControllerBug 你能看看吗? 嗯,为什么你是对的。 collectionView 是 nil,尽管一个有效的被传递给数据源方法。那很奇怪。自从我配置一个没有故事板的集合视图以来已经有好几年了,所以毫无疑问,有一些技巧让我忘记了。如果我能抽出一些时间,我会看看是否能解开谜题......同时,我强烈推荐集合视图的故事板,管理单元类型等更容易。跨度> 一个 PR 正等着你演示如何在 Swift 中完成这项工作。 非常感谢您提供的有效解决方案!在这种情况下我使用笔尖的原因是我需要在一个屏幕上显示两个集合视图。我想不出在情节提要中做到这一点的方法。无论如何,您的解决方案将适用于我的用例! 我如何在故事板中做到这一点是使用容器视图来嵌入单独的控制器——我非常喜欢通过使用组合来降低复杂性。不过,这确实需要一点时间来掌握。

以上是关于无法将 collectionView 插座添加到 nib 中的 UICollectionViewController的主要内容,如果未能解决你的问题,请参考以下文章

插座无法连接到重复内容

将tapGestureRecognizer添加到其背景视图时无法触发collectionview的事件

我无法将按钮连接到任何插座或操作

将点击手势添加到插座集合

无法链接到 XCode9 中的插座集合

Xamarin.Forms 如何将数据从 CollectionView 传输到不同的视图?