无法将 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
。当我在笔尖内添加一个从 UICollectionViewController
到 UICollectionView
的插座 collectionView
时,上面的行抛出以下错误:
'NSInvalidArgumentException', reason: 'Can't add self as subview'
可能是我的想法有误,但我想不通为什么会出现这个错误。
这是我的笔尖:
编辑:
当我没有在我的笔尖上添加任何插座时,错误消失了。但是 UICollectionViewController
里面的 collectionView
是 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
发生这种情况的原因是尽管 Interface Builder 将该控制器显示为 UICollectionViewController,但 collectionView 的内部魔力 link 被破坏了。原因包括
- 它被创建为不同的控制器类型,class 被重命名为 UICollectionView
- 它被创建为 UICollectionView,但 class 被编辑为 IB 识别的其他内容,然后被编辑回来
- 有人在您背后编辑了 XML 源代码。也许在积极编辑的同时恢复版本控制?
- IB 崩溃了,感到困惑,或者只是觉得胡思乱想
但是正如人们指出的那样,在正确构造的 nib 中,collectionView 绝对会在 viewDidLoad 时填充。因此,如果不是,我建议拖出一个新的控制器实例并将其丢弃。这几乎肯定比试图弄清楚这个管道是如何以及为什么坏掉的要快。
编辑:
直到旧式笔尖范式在 Swift 中不起作用。谁知道?不是我,我从 Swift 开始就只使用故事板。如何在没有情节提要的情况下正确加载 UICollectionView subclass 作为主视图 is on Github here 对于那些遇到相同问题的人。
我正在尝试以下列方式实例化 UICollectionViewController
:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
UINib(nibName: "TestController", bundle: nil).instantiateWithOwner(nil, options: nil)
}
}
我的笔尖叫做 TestController.xib
并且包含一个 UICollectionViewController
和一个 UICollectionView
。当我在笔尖内添加一个从 UICollectionViewController
到 UICollectionView
的插座 collectionView
时,上面的行抛出以下错误:
'NSInvalidArgumentException', reason: 'Can't add self as subview'
可能是我的想法有误,但我想不通为什么会出现这个错误。
这是我的笔尖:
编辑:
当我没有在我的笔尖上添加任何插座时,错误消失了。但是 UICollectionViewController
里面的 collectionView
是 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
发生这种情况的原因是尽管 Interface Builder 将该控制器显示为 UICollectionViewController,但 collectionView 的内部魔力 link 被破坏了。原因包括
- 它被创建为不同的控制器类型,class 被重命名为 UICollectionView
- 它被创建为 UICollectionView,但 class 被编辑为 IB 识别的其他内容,然后被编辑回来
- 有人在您背后编辑了 XML 源代码。也许在积极编辑的同时恢复版本控制?
- IB 崩溃了,感到困惑,或者只是觉得胡思乱想
但是正如人们指出的那样,在正确构造的 nib 中,collectionView 绝对会在 viewDidLoad 时填充。因此,如果不是,我建议拖出一个新的控制器实例并将其丢弃。这几乎肯定比试图弄清楚这个管道是如何以及为什么坏掉的要快。
编辑:
直到旧式笔尖范式在 Swift 中不起作用。谁知道?不是我,我从 Swift 开始就只使用故事板。如何在没有情节提要的情况下正确加载 UICollectionView subclass 作为主视图 is on Github here 对于那些遇到相同问题的人。