- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的类中有一个 UICollectionView 声明为@IBOutlet 弱变量artworkCollectionView:UICollectionView!
该类中有一个委托(delegate)方法,由另外两个 View Controller 调用,其中一个 VC 是弹出窗口,另一个是普通 VC。
委托(delegate)方法从数据库获取一些数据,然后更新闭包内调用的 Collection View :self.artworkCollectionView.reloadData()
当弹出的 VC 调用委托(delegate)方法时,一切都很好。但是,当普通 VC 在访问 self.artworkCollectionView.reloadData() 时调用委托(delegate)方法时,它会收到臭名昭著的 fatal error :隐式展开可选值时意外发现 nil。
我已经检查了对单元格重用标识符的所有引用,一切都是正确的。我怀疑由于 UICollectionView 被声明为弱var,当我从当前类转到弹出窗口然后弹出窗口调用委托(delegate)方法时,引用不会丢失,但是当我从当前类转到普通类时VC 然后普通的 VC 调用委托(delegate)方法,对我的弱变量的引用丢失了,因此它被“视为”nil。
@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()
}
})
}
}
}
如果我是对的,我的问题是:我怎样才能给weak varartworkCollectionView:UICollectionView!一个强引用,这样它就不会在从当前类到普通 VC 并返回的流程中丢失?
编辑:这是我迄今为止尝试过的:
从 socket 声明中删除“weak”,使其成为:@IBOutlet varartworkCollectionView:UICollectionView!但我遇到了同样的错误
我通过重写performSegue将artworkCollectionView传递给普通VC,然后将其作为委托(delegate)方法的参数传递回来。这不会给我 fatal error ,但它也不会重新加载 UICollectionView,因为我认为无论如何对 UICollectionView 导出的弱引用都会丢失。
感谢您的帮助(免责声明:我对 Swift 还很陌生......)
最佳答案
Inside this class there is one delegate method called by two other View Controllers, one of these VC is a pop up, the other one is a normal VC.
The delegate method gets some data from the database and then updates the collection view calling inside a closure: self.artworkCollectionView.reloadData()
UICollectionView
将使用该数据进行更新.您的问题如下:
I passed artworkCollectionView to the normal VC via override performSegue and then passed it back as an argument of the delegate method. This does not give me the fatal error but also it does not reload the UICollectionView because I think that anyway the weak reference to the UICollectionView outlet is lost. You shouldn't be passing anything around like this in most cases unless you have a really good reason to do so (I don't see one).
您希望在这里进行关注点分离。你必须仔细考虑你想要在 VC 之间传递什么,以避免在它们之间产生奇怪的依赖关系。由于多种原因,我不会通过 socket ,第一个是,如果您决定更改它,您现在必须在多个 VC 中跟踪 socket 。第二个是,它需要太多的心理体操来跟踪导出的状态,因为它被到处传递。导出也仅保证在生命周期的某些阶段进行设置。例如,如果您从 prepareForSegue:sender:
中的 segue 检索目标 VC 并尝试引用当时的导出,它们都将为零,因为它们尚未设置。
这些都是为什么包含上述代码的 VC 应该是唯一一个(也是唯一一个)保持对 artworkCollectionView
中显示的内容和时间的控制的充分理由。这里的问题是你如何解决这个问题,而不是让弹出窗口或普通 VC 调用委托(delegate)方法或做一些奇怪的事情,例如将导出从一个 VC 传递到另一个 VC,而只是传递数据。
最简单的例子是:
parentViewController
或presentingViewController
以获取对原始 VC 的引用。UIButton
来关闭,而不是为他们执行此操作)。viewWillAppear
将数据内容加载到UICollectionView
当时。我认为您没有理由要传递原始 VC 之外的任何网点,而该 VC 应该是管理该网点的网点。
关于swift - 在委托(delegate)方法中引用时,弱 var 导出会丢失 (=nil),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55959504/
我一直在尝试编写我自己的弱/强指针,但我并不清楚其中的关系。我似乎遇到的所有事情都没有说清楚,而且一个医生经常会反驳另一个医生所说的话。任何人都可以详细解释弱/强指针关系,也许还有图像或代码示例吗?
静态/动态和强/弱类型之间有什么区别? 最佳答案 静态/动态类型涉及何时获取类型信息(在编译时或运行时) 强/弱类型是关于如何严格区分类型(例如,语言是否尝试从字符串到数字进行隐式转换)。 请参阅wi
我有一个非常奇怪的情况。我的服务器当前已关闭并收到 503 http 状态代码。基于如下给定的代码,代码进入 if 条件,但是当我将调试点置于 let error = self?.decodeErro
对于短期运行的操作,避免[weak self]是否可以接受?例如,URLSession 将保留 dataTask(with:completion:) 的闭包: final class ViewCont
我有一个非常奇怪的情况。我的服务器当前已关闭并收到 503 http 状态代码。基于如下给定的代码,代码进入 if 条件,但是当我将调试点置于 let error = self?.decodeErro
假设我有以下情况: Test1.java import java.lang.ref.WeakReference; public class Test1 { public WeakReferen
有没有办法告诉模拟器(我正在使用 Modelsim)当信号不是由任一双向接口(interface)驱动时将信号拉到弱“H”? 例如,如果我有一个 I2C 信号 I2C_SDA 被声明为来自 2 个模块
这是将一些值放入 WeakHashMap 中然后从映射中删除这些值的代码片段。它如何处理分配的内存? import java.util.*; public class WeakHashMap_Main
我正在尝试弄清楚智能指针可以实现什么。 但有一些感觉像是障碍。 普通指针有一个简短的定义 Someclass *p但是智能指针有点长shared_ptr p当您必须处理这些指针的模板(如 vector
这两行代码有区别吗? __weak IBOutlet UITextField *usernameField; @property (weak) IBOutlet UITextField *userna
我最近发现了 WeakHashMap Java 中的数据结构。 但是,我不明白它在不再正常使用时对映射进行垃圾收集是什么意思。数据结构如何知道我将不再在我的程序中使用 key ?如果长时间不引用 ke
我的问题是为什么 weak IBOutletCollection 总是 nil?如果将弱变强,我所有的按钮都在那里,这真的很奇怪。我试图理解苹果的逻辑,我看不出单个按钮和一组按钮在内存管理方面没有区别
我创建一个 WeakHashMap 为 WeakHashMap map = new WeakHashMap(); map.put(emp,"hello"); 其中 emp 是一个 Employee 对
在delphi sydney中,在对象(不是接口(interface))前面设置[weak]会受到惩罚吗?示例: TMyObject = class(Tobject) Private
在delphi sydney中,在对象(不是接口(interface))前面设置[weak]会受到惩罚吗?示例: TMyObject = class(Tobject) Private
众所周知,我们将声明一个可以打破强引用循环的弱委托(delegate)对象: // MyObject.h ... @property (nonatomic, weak) id delegate; ..
我已阅读this article关于Java中不同类型的引用(强引用、软引用、弱引用、幻像引用),但我不太理解。 这些引用类型之间有什么区别?每种类型何时使用? 最佳答案 Java 提供了两种不同类型
我突然想到...我相信弱引用的生命 与该引用的范围(在函数内或全局内)相关。 所以我想知道,只要我将数据处理保持在特定范围内,那么我应该可以使用 weak 与 strong 引用。正确的? 我问的原因
func addAdditionalElement(_ additionalSelectedElementsIDs: [String], startX: CGFloat, containerView:
我想要一个指针,以便我可以判断引用计数何时为 1。本质上,指针的工作方式类似于 weak_ptr,但清理工作需要手动进行。也就是说,程序每隔一段时间就会经历一个指针循环,并检查哪些指针只剩下一个引用。
我是一名优秀的程序员,十分优秀!