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() 并不总是有效的主要内容,如果未能解决你的问题,请参考以下文章

HTTPS并不总像它看起来那么可靠

为啥 Maven 不总是从 theartefactory 下载最后一个依赖项,从竹子构建?

出口集合 removefromsuperview

removeFromSuperview 随机崩溃

removeFromSuperview() 耗时过长

无法使用 removeFromSuperview 方法删除视图