Swift 在委托方法中引用时,弱var出口丢失(=零)
我的类中有一个UICollectionView声明为 @IBOutlet弱var artworkCollectionView:UICollectionView 在这个类中,有一个委托方法被另外两个视图控制器调用,其中一个是弹出窗口,另一个是普通的VC 委托方法从数据库中获取一些数据,然后更新在闭包内调用的集合视图: self.artworkCollectionView.reloadData() 当弹出式VC调用委托方法时,一切都很好。但是当委托方法到达self.artworkCollectionView.reloadData()时被普通VC调用时,它会得到一个臭名昭著的致命错误:在隐式展开可选值时意外发现nil 我已经检查了所有对cell reuseIdentifier的引用,并且都是正确的。我怀疑,由于UICollectionView被声明为弱var,当我从当前类转到弹出窗口,然后弹出窗口调用委托方法时,引用没有丢失,但当我从当前类转到普通VC,然后普通VC调用委托方法时,对我的弱var的引用丢失,因此它被“看到”零 如果我是对的,我的问题是:我如何给出弱var artworkCollectionView:UICollectionView!一个强大的引用,这样它就不会在从当前类到普通VC的流中丢失 编辑:以下是我到目前为止尝试的内容:Swift 在委托方法中引用时,弱var出口丢失(=零),swift,Swift,我的类中有一个UICollectionView声明为 @IBOutlet弱var artworkCollectionView:UICollectionView 在这个类中,有一个委托方法被另外两个视图控制器调用,其中一个是弹出窗口,另一个是普通的VC 委托方法从数据库中获取一些数据,然后更新在闭包内调用的集合视图: self.artworkCollectionView.reloadData() 当弹出式VC调用委托方法时,一切都很好。但是当委托方法到达self.artworkCollection
UICollectionView
将使用该数据更新prepareforsgue:sender:
中的segue中检索目标VC,并尝试引用当时的出口,它们将全部为零,因为它们尚未设置
这些都是包含上述代码的VC应该(也是唯一一个)控制在artworkCollectionView
中显示的内容以及显示时间的原因。这里的问题是如何处理这个问题,而不是让弹出窗口或普通VC调用委托方法,或者做一些奇怪的事情,比如从一个VC传递出口到另一个VC,而是传递数据
最简单的例子是:
parentViewController
或
presentingViewController
获取对原始VC的引用ui按钮来关闭,而不是为他们这样做)
视图将出现
以将数据内容加载到
当时的UICollectionView@IBOutlet weak var artworkCollectionView: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
// Set up
artworkCollectionView.dataSource = self
artworkCollectionView.delegate = self
artworkCollectionView.isUserInteractionEnabled = true
artworkCollectionView.allowsSelection = true
artworkCollectionView.register(UINib(nibName:
"MyCollectionViewCell", bundle: nil),
forCellWithReuseIdentifier: "cell")
}
// delegate method
func reloadCollections() {
retrieveAlbumRatings { (isAlbum) in
if isAlbum {
self.retrieveAlbumData(completion: { (isFinished) in
if isFinished {
// Reload collection views
self.artworkCollectionView.reloadData()
}
})
}
}
}
//Make artworkCollectionView a normal weak var, not implicitly unwrapped.
//You'll need to change your other code to unwrap it every time you use it.
@IBOutlet weak var artworkCollectionView: UICollectionView?
func reloadCollections() {
retrieveAlbumRatings { (isAlbum) in
if isAlbum {
//The construct `[weak self]` below is called a capture list
self.retrieveAlbumData(completion: { [weak self] (isFinished) in
guard let weakSelf = self else {
print("self is nil");
return
}
}
if isFinished {
// Reload collection views
guard let collectionView = weakSelf.artworkCollectionView else {
print("collectionView is nil!")
return
}
collectionView.reloadData()
})
}
}
}