我正在尝试以下列方式实例化UICollectionViewController
:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
UINib(nibName: "TestController", bundle: nil).instantiateWithOwner(nil, options: nil)
}
}
我的笔尖名为TestController.xib
,其中包含UICollectionViewController
,其中包含UICollectionView
。当我在笔尖内部添加从collectionView
到UICollectionViewController
的插座UICollectionView
时,上面的行会引发以下错误:
'NSInvalidArgumentException', reason: 'Can't add self as subview'
我的想法可能存在错误,但我无法弄清楚为什么会出现这种错误。
这是我的笔尖:
当我在笔尖中没有添加任何插座时,错误消失。但是,我collectionView
内的UICollectionViewController
就像nil
一样:
public class MyCollectionViewController: UICollectionViewController {
override public func viewDidLoad() {
super.viewDidLoad()
//unwrapping error!
self.collectionView!.backgroundColor = UIColor.blueColor()
}
}
我该如何解决这个问题?
我在这个简单的xcode项目中重现了错误:https://github.com/Damnum/ReproduceControllerBug
答案 0 :(得分:1)
发生这种情况的原因是虽然Interface Builder将该控制器显示为UICollectionViewController,但是对collectionView的内部魔术链接仍然存在。原因包括
但正如人们所指出的那样,在正确构造的nib collectionView中,绝对会在viewDidLoad时填充。所以,如果不是,我建议拖出一个新的控制器实例并抛弃这个实例。这几乎可以肯定比试图弄清楚管道在这个管道上的确切方式和原因要快得多。
编辑:
TIL认为旧学校笔尖范式在Swift中不起作用。谁知道?不是我,我从斯威夫特的黎明开始就只使用过故事板。如何在没有故事板is on Github here的情况下正确加载UICollectionView子类作为主视图,以便遇到同样的问题。