UIView 即使在开始从超级视图中删除后也会重新出现

Posted

技术标签:

【中文标题】UIView 即使在开始从超级视图中删除后也会重新出现【英文标题】:UIView reappear even after begin removed from superview 【发布时间】:2017-06-21 18:02:46 【问题描述】:

我有一个问题,如果我从超级视图中删除子视图,然后当我推送到另一个 VC 并返回时,所有删除的子视图都重新出现在视图中,我已经尝试了所有方法并检查了我的代码是否也有 viewDidApper。

//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()

提前致谢

【问题讨论】:

您确定视图不在另一个视图容器中吗? @Edu 我确定我已经包含了一个可以下载和检查的测试项目 【参考方案1】:

我查看了测试项目。 我想我发现了问题,它在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 时看不到任何重复的用户

【讨论】:

谢谢,修复 removeFromSuperview() 解决了我的问题【参考方案2】:

首先要看...

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 功能...您会立即看到的。

【讨论】:

他也可以简单地在开头调用 super.removeFromSuperView() 吗? 那将失去“渐隐”动画。他可以修复他的.setAnimationDidStop 选择器...但块格式通常被认为是“未来的方式”(取决于意见)。 @DonMag 谢谢修复它我总是在功能中使用块格式,这很有帮助:)

以上是关于UIView 即使在开始从超级视图中删除后也会重新出现的主要内容,如果未能解决你的问题,请参考以下文章

模态视图控制器即使在设置其框架 iphone 后也会与导航栏重叠

如何从超级视图中删除视图?

即使重新安装节点后也不会删除打字稿

即使从门户中删除,逻辑应用工作流也会继续发布消息

即使在我删除它们后,Firebase 值也会不断重新生成

长按和触摸开始