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 即使在开始从超级视图中删除后也会重新出现的主要内容,如果未能解决你的问题,请参考以下文章