我正在开发我的 UITableviewcell,其中有一个 UIView 供用户“点击”并启动计时器。我正在完全以编程方式创建我的 UItableview 单元组件,并在 UITableviewcell 类而不是父视图控制器中添加计时器组件。
我遇到的问题是我的计时器应该对于每个 UITableviewcell 都是不同的。用户应该能够在一个单元格中启动计时器并滚动其他单元格以启动/停止另一个单元格。但是,当我“点击”我的第一个单元格时,计时器不仅在第一个单元格上启动,而且我还可以看到它在第三个单元格上启动。
我试图通过使用 PrepareForReuse 和使计时器无效来纠正此问题,但这也会导致第一个单元格的计时器无效。
我试图研究这个问题,但没有发现完全匹配。谁能告诉我如何解决这个问题?
class ActiveExerciseTableViewCell: UITableViewCell, UITextFieldDelegate {
static let tableviewidentifier = "activeExerciseTableViewCell"
var tableviewContentViewTabBarHeight = CGFloat()
var exerciseCellKeyboardHeight = CGFloat()
var restTimer = Timer()
var restTimeRemaining: Int = 180
var isRestTimerRunning: Bool = false
let activeExerciseTimerUIView: UIView = {
let activeExerciseTimerUIView = UIView()
activeExerciseTimerUIView.backgroundColor = .darkGray
return activeExerciseTimerUIView
}()
let timerLabel: UILabel = {
let timerLabel = UILabel()
timerLabel.text = "180"
timerLabel.textColor = .black
timerLabel.adjustsFontSizeToFitWidth = true
return timerLabel
}()
override func prepareForReuse() {
super.prepareForReuse()
if self.isRestTimerRunning == false {
restTimer.invalidate()
restTimeRemaining = 180
timerLabel.text = prodTimeString(time: TimeInterval(restTimeRemaining))
}
}
func setUpActiveExerciseUIViewLayout(){
timerLabel.translatesAutoresizingMaskIntoConstraints = false
timerLabel.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true
timerLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: (contentView.frame.height-tableviewContentViewTabBarHeight)*0.55).isActive = true
timerLabel.widthAnchor.constraint(equalToConstant: contentView.frame.width * 0.7).isActive = true
timerLabel.heightAnchor.constraint(equalToConstant: 80).isActive = true
timerLabel.font = .boldSystemFont(ofSize: 64)
activeExerciseTimerUIView.translatesAutoresizingMaskIntoConstraints = false
activeExerciseTimerUIView.centerXAnchor.constraint(equalTo: contentView.centerXAnchor).isActive = true
activeExerciseTimerUIView.topAnchor.constraint(equalTo: contentView.topAnchor, constant: (contentView.frame.height-tableviewContentViewTabBarHeight)*0.25).isActive = true
activeExerciseTimerUIView.widthAnchor.constraint(equalToConstant: 225).isActive = true
activeExerciseTimerUIView.heightAnchor.constraint(equalToConstant: 225).isActive = true
let timerStartGesture = UITapGestureRecognizer(target: self, action: #selector(playTapped))
timerStartGesture.numberOfTapsRequired = 1
activeExerciseTimerUIView.addGestureRecognizer(timerStartGesture)
activeExerciseTimerUIView.isUserInteractionEnabled = true
}
@objc func playTapped(_ sender: Any) {
if isRestTimerRunning == false {
restTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(step), userInfo: nil, repeats: true)
self.isRestTimerRunning = true
}
}
@IBAction func pauseTapped(_ sender: Any) {
restTimer.invalidate()
}
@IBAction func resetTapped(_ sender: Any) {
restTimer.invalidate()
restTimeRemaining = 180
timerLabel.text = prodTimeString(time: TimeInterval(restTimeRemaining))
}
@objc func step() {
if restTimeRemaining > 0 {
restTimeRemaining -= 1
} else {
restTimer.invalidate()
restTimeRemaining = 180
}
timerLabel.text = prodTimeString(time: TimeInterval(restTimeRemaining))
}
public func prodTimeString(time: TimeInterval) -> String {
let Minutes = Int(time) / 60 % 60
let Seconds = Int(time) % 60
return String(format: "%02d:%02d", Minutes, Seconds)
}