2017-06-22 49 views
1

我声明了一个名为var progressBar的UIView变量:UIView?removeFromSuperview()并不总是奏效

,我表现出来或隐藏此功能

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()视图之间一点。在我看来,如果视图失去了对旧的进度条的引用......您是否对这个问题有了解,以及如何修复它?

+0

尝试直接在else cond中删除progressBar。我认为没有必要在DispathQueue.main.async() –

+0

中删除它我添加了DispatchQueue.main.async()以查看它是否可以解决问题。没有它,问题依然存在。 –

+0

隐藏progressBar不起作用? –

回答

1

如果您只想显示和隐藏您的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() 
     } 
    } 
} 
+0

我想过了,但progressBar对用户来说很少显示,所以我认为,从性能角度来看,它总是隐藏在应用程序中没有任何意义 –

+0

很可能您会创建一个新的progressBar '而现有的还在那里。在创建一个新的之前,你应该首先检查它是否被释放。 – Lawliet

+0

谢谢。将ProgressBar作为单例生成也是有意义的吗? –

3

如果你调用showProgressBar两次,这不是验证了有没有酒吧了,所以你可以添加第二个和丢失的第一个参考。因此,当你删除它时,它只是删除第二个而不起作用。