2017-01-02 176 views
0

我有一个buttontimingView,按钮本身就说明,当计时器启动时左:按钮被删除

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

+0

你确定你已经放置的时间视图内的按钮? –

+0

@MidhunMP是我在界面构建器中做过 –

+0

检查它是否正确放置在定时视图中,如果可能请分享一下ib树形结构? –

回答

0

timer为全局变量。在初始化之前,请检查timer是否为nil。在timer.invalidate()之后写timer = nil

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

    } 
}