UIView甚至在开始从超级视图中删除后重新出现

问题描述:

我有一个问题,如果我从超级视图中删除子视图,然后当我推到另一个VC和回来所有删除的子视图重新出现在视图中我已经试过一切,并检查我的代码如果viewDidApper也是。UIView甚至在开始从超级视图中删除后重新出现

enter image description here

//HERE IS HOW I ADD VIEWS 

func addusers() { 

    for user in 0...5 { 
     let radarButton = PRButton(frame: CGRect(x: 0, y: 0, width: itemSize.width, height: itemSize.height+14)) 
     radarButton.profileButton?.setImage(UIImage(named: "dummy-avatar.png"), for: UIControlState()) 
     radarButton.profileName.setTitle("test \(user)", for: .normal) 

     repeat { 
      let center = generateCenterPointInRadar() 
      radarButton.center = CGPoint(x: center.x, y: center.y) 

     } while (itemFrameIntersectsInOtherItem(radarButton.frame)) 
     radarButton.profileButton?.addTarget(self, action: #selector(didTapUser), for: .touchUpInside) 
     radarButton.profileName?.addTarget(self, action: #selector(didTapUser), for: .touchUpInside) 
     self.addSubview(radarButton) 
     items.append(radarButton) 
    } 

} 

//HERE IS HOW I REMOVE VIEWS 
func removeAllUsers() { 
    for view in self.subviews { 
     if view is PRButton { 
      view.removeFromSuperview() 
     } 
    } 
    items.removeAll() 

} 
//Remove from superview 
    override func removeFromSuperview() { 

     UIView.beginAnimations("", context: nil) 
     UIView.setAnimationDuration(1) 
     self.alpha = 0 
     UIView.setAnimationDidStop(Selector(("callSuperRemoveFromSuperview"))) 
     UIView.commitAnimations() 

    } 

fileprivate func callSuperRemoveFromSuperview() { 
    super.removeFromSuperview() 
} 

在此先感谢

+0

您确定视图不在另一个视图容器内吗? – Edu

+0

@Edu我相信我已经包含了一个测试项目,您可以下载并检查 –

首先要看看......

PRButton您覆盖removeFromSuperview() - 但你的结构是不正确的,你永远不会真正删除视图。

这种替换:

override func removeFromSuperview() { 

    UIView.animate(withDuration: 1.0, animations: ({ 
     self.alpha = 0.0 
    }), completion: { _ in 
     self.callSuperRemoveFromSuperview() 
    }) 

} 

你也可以简单地调用super.removeFromSuperview()而不是你的额外self.callSuperRemoveFromSuperview()功能。

了解Debug View Hierarchy功能...您会立即看到该功能。

+0

他可以在开始时简单地调用super.removeFromSuperView()吗? – Larry

+0

这将失去“淡入淡出”动画。他*也可以修复他的'.setAnimationDidStop'选择器......但是块格式通常被认为是“未来之路”(取决于意见)。 – DonMag

+0

@DonMag谢谢修复它我生病总是使用块格式功能,帮助了很多:) –

我看了看测试项目。 我想我找到了问题,这是在override func removeFromSuperview() 我注释掉它和编辑removeAllUsers()

func removeAllUsers() { 
    for view in self.subviews { 
     if view is PRButton { 
      UIView.animate(withDuration: 1, animations: { 
      view.alpha = 0 
      }, completion: { (finished) in 
      view.removeFromSuperview() 
      }) 
     } 
    } 
    items.removeAll() 

} 

现在,我看不出有任何重复的用户,而我回viewController

+0

谢谢,修复removeFromSuperview()解决了我的问题 –