在我的快速游戏中,我们有一个主要的游戏场景,然后一旦你在游戏中死亡,它会让你进入一个结束游戏屏幕,显示你的分数。然后,在该屏幕上,用户可以选择点击按钮将场景改回游戏。大多数情况下,按钮被移除,一切正常,但每隔一段时间它就不会将其移除并覆盖在游戏场景上。这是按钮运行的代码 -
scoreLabel.removeFromSuperview()
highLabel.removeFromSuperview()
RestartBtn.removeFromSuperview()
self.RestartBtn.removeFromSuperview()
self.highLabel.removeFromSuperview()
self.menuButton.removeFromSuperview()
self.scoreLabel.removeFromSuperview()
self.scene!.view?.presentScene(GameplayScene(), transition: SKTransition.crossFadeWithDuration(0.8))
答案 0 :(得分:0)
self.menuButton
和所有其他人可能是weak
个引用
即,一旦视图从superview中移除,它们就会变得陈旧。它有时是有效的,有时候并不是在self.menuButton = <something>
中引用它的方式,如果在loadView
或viewDidLoad
中完成,它只是危险的。
不同方法
我建议不要过多地使用UI,并采用更加常规的引用技术,例如hidden
或alpha = 0
。
self.menuButton.removeFromSuperview()
// self.menuButton is stale. You can't re-add your button from that reference
动画显示/隐藏视图
这不会破坏你的引用,看起来比removeFromSuperview
:
// Hide with animation
[UIView animateWithDuration:.4f animations:^{
[self.menuButton setAlpha:0]; // Hide with animation
} completion:^(BOOL finished) {
// If you decide to remove the view permanently, do it here
// Without knowing more, I wouldn't recommend it
}];
然后,您可以再次显示UI,无论是否有动画:
[self.menuButton setAlpha:1]; // Show without animation