删除超级视图后未删除按钮

时间:2017-01-02 09:53:03

标签: ios swift uikit

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个定时器同时进行(按钮)标签每秒更改两次,到不同的数字),我该如何避免这种情况?

编辑:

enter image description here

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