removeFromSuperview() 并不总是有效
Posted
技术标签:
【中文标题】removeFromSuperview() 并不总是有效【英文标题】:removeFromSuperview() not always working 【发布时间】:2017-06-22 14:26:12 【问题描述】:我声明了一个名为 var progressBar : UIView 的 UIView 变量?
然后我用这个函数显示或隐藏视图
func showProgressBar(showBar: Bool)
if showBar
let viewHeight = view.frame.size.height
progressBar = Bundle.main.loadNibNamed("progressBar", owner: nil, options: nil)?.first as? UIView
progressBar?.frame = CGRect(x: 0, y: viewHeight - 80 , width: self.view.frame.width, height: 80)
if let bar = progressBar
self.view.addSubview(bar)
else
DispatchQueue.main.async()
self.progressBar?.removeFromSuperview()
有时,当我在视图之间稍微导航时,我无法隐藏进度条,即使在执行 self.progressBar?.removeFromSuperview()
时也是如此。在我看来,如果视图丢失了对旧进度条的引用...你知道这个问题以及我该如何解决它吗?
【问题讨论】:
尝试在 else cond 中直接删除 progressBar。我认为不需要在 DispathQueue.main.async() 中删除它 我添加了 DispatchQueue.main.async() 看看它是否解决了问题。没有它,问题仍然存在。 隐藏进度条不起作用? 不,同样的问题,有时工作有时不行 你能分享你的完整课程吗? 【参考方案1】:如果您调用 showProgressBar 两次,则未验证已经没有 bar,因此您可能会添加第二个 bar 并丢失对第一个 bar 的引用。因此,当您删除它时,它只会删除第二个并且不起作用。
【讨论】:
【参考方案2】:如果您只想显示和隐藏您的progressBar
,为什么不使用self.progressBar.hidden = true/false
?这样一来,您只需创建一次progressBar
,并在不再使用它时创建removeFromSuperview
。
func showProgressBar(showBar: Bool)
if showBar
// Check this first
if progressBar == nil
let viewHeight = view.frame.size.height
progressBar = Bundle.main.loadNibNamed("progressBar", owner: nil, options: nil)?.first as? UIView
progressBar?.frame = CGRect(x: 0, y: viewHeight - 80 , width: self.view.frame.width, height: 80)
if let bar = progressBar
self.view.addSubview(bar)
else
DispatchQueue.main.async()
self.progressBar?.removeFromSuperview()
【讨论】:
我考虑过,但是progressBar很少会显示给用户,所以我认为,从性能的角度来看,将它始终隐藏在应用程序中是没有意义的 很可能您创建了一个新的progressBar
,而现有的progressBar
仍然存在。在创建新的之前,您应该首先检查它是否已被释放。
谢谢。将 ProgressBar 类设为单例也有意义吗?
是的,我通常是这样实现的
奇怪的是,您在调用该方法的同一线程上添加子视图,但是您显式地转移到主队列以删除子视图。可能不需要这个显式的异步调用。以上是关于removeFromSuperview() 并不总是有效的主要内容,如果未能解决你的问题,请参考以下文章