button
中有一个timingView
,按钮本身显示启动计时器时剩下的时间:
func startTiming(button: UIButton, duration: Double, timingView: UIView?) {
var duration = duration
button.setTitle(String(Int(duration)), for: .normal)
let timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) {_ in
if duration > 0 {
duration -= 1
button.setTitle(String(Int(duration)), for: .normal)
}
}
DispatchQueue.main.asyncAfter(deadline: .now() + duration) {
timer.invalidate()
if timingView != nil {
timingView?.removeFromSuperview()
}
}
}
每当用户在计时期间点击timingView
时,button
都会被删除:
func cancelAbilityTiming(sender: UIButton) {
sender.superview!.superview!.removeFromSuperview()
// remove timingView from superview
}
我期待timingView
并且每次取消定时器时都会删除所有子视图,但是,如果我取消定时器然后重新启动它,那么将有2个定时器同时进行(按钮)标签每秒更改两次,到不同的数字),我该如何避免这种情况?
编辑:
答案 0 :(得分:0)
将timer
作为全局变量。在初始化之前,还要检查timer
是否为nil
。在timer = nil
之后写下timer.invalidate()
。
答案 1 :(得分:0)
我真的不喜欢强力展开superview。相反,你可以做这样的事情。
为timingView
添加标签,并确保它在超级视图中是唯一的。
例如
timingView.tag = 99
如果button
没有通过故事板完成,请确保timingView
被添加为cancelAbilityTiming()
的子视图。
将func cancelAbilityTiming(sender: UIButton) {
for subview in self.view.subviews {
if subview.tag == 99 {
//Removing timingView
subview.removeFromSuperview()
}
}
}
修改为此
DataKeyNames