无法将 collectionView 出口添加到 nib 中的 UICollectionViewController

Cannot add collectionView outlet to UICollectionViewController in nib

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

class ViewController: UIViewController {

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

我的笔尖叫做 TestController.xib 并且包含一个 UICollectionViewController 和一个 UICollectionView。当我在笔尖内添加一个从 UICollectionViewControllerUICollectionView 的插座 collectionView 时,上面的行抛出以下错误:

'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

发生这种情况的原因是尽管 Interface Builder 将该控制器显示为 UICollectionViewController,但 collectionView 的内部魔力 link 被破坏了。原因包括

  • 它被创建为不同的控制器类型,class 被重命名为 UICollectionView
  • 它被创建为 UICollectionView,但 class 被编辑为 IB 识别的其他内容,然后被编辑回来
  • 有人在您背后编辑了 XML 源代码。也许在积极编辑的同时恢复版本控制?
  • IB 崩溃了,感到困惑,或者只是觉得胡思乱想

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

编辑:

直到旧式笔尖范式在 Swift 中不起作用。谁知道?不是我,我从 Swift 开始就只使用故事板。如何在没有情节提要的情况下正确加载 UICollectionView subclass 作为主视图 is on Github here 对于那些遇到相同问题的人。