无法将collectionView插座添加到nib

时间:2016-06-09 12:25:04

标签: ios swift uicollectionview xcode7 nib

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

class ViewController: UIViewController {

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

我的笔尖名为TestController.xib,其中包含UICollectionViewController,其中包含UICollectionView。当我在笔尖内部添加从collectionViewUICollectionViewController的插座UICollectionView时,上面的行会引发以下错误:

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

我的想法可能存在错误,但我无法弄清楚为什么会出现这种错误。

这是我的笔尖:

enter image description here

编辑:

当我在笔尖中没有添加任何插座时,错误消失。但是,我collectionView内的UICollectionViewController就像nil一样:

public class MyCollectionViewController: UICollectionViewController {

    override public func viewDidLoad() {
        super.viewDidLoad()

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

我该如何解决这个问题?

编辑2:

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

1 个答案:

答案 0 :(得分:1)

发生这种情况的原因是虽然Interface Builder将该控制器显示为UICollectionViewController,但是对collectionView的内部魔术链接仍然存在。原因包括

  • 它是作为不同的控制器类型创建的,并且类已重命名为UICollectionView
  • 它是作为UICollectionView创建的,但是该类被编辑为IB识别的其他内容,然后进行了编辑。
  • 编辑了背后的XML源代码。版本控制恢复,同时可能主动编辑?
  • IB坠毁,迷茫,或只是感到胡思乱想

但正如人们所指出的那样,在正确构造的nib collectionView中,绝对会在viewDidLoad时填充。所以,如果不是,我建议拖出一个新的控制器实例并抛弃这个实例。这几乎可以肯定比试图弄清楚管道在这个管道上的确切方式和原因要快得多。

编辑:

TIL认为旧学校笔尖范式在Swift中不起作用。谁知道?不是我,我从斯威夫特的黎明开始就只使用过故事板。如何在没有故事板is on Github here的情况下正确加载UICollectionView子类作为主视图,以便遇到同样的问题。