我需要有关委托和协议问题背后的逻辑的帮助。我制作了一个计时器应用程序,可让您设置计时器。计时器选择位于SettingsController中,我使用了协议和委托将数据传递到TimerController中。这作为计时器更改。但是我在创建重置按钮的逻辑时遇到问题。我希望重置按钮具有相同的数据。例如,如果我选择5分钟作为计时器,则重置按钮将重置为5分钟。当前将其重置为0。问题实际上是将数据从委托函数提取到TimerController中,因此我可以将counter的值更改为nil。
SettingsController
import UIKit
protocol SettingsVCDelegate {
func didSelectReadingSpeed(counter: Int)
}
class SettingsVC: UIViewController {
var counter = Int()
var settingsDelegate: SettingsVCDelegate!
@IBAction func changeReadingSpeed(_ sender: UISlider) {
speedSlider.value = roundf(speedSlider.value)
if speedSlider.value == 1 {
speedLabel.text = "1 min (60 pgs / hr) Extreme"
counter = 1
print(counter)
} else if speedSlider.value == 2 {
speedLabel.text = "2 min (30 pgs / hr) Fast"
counter = 2
}
}
@IBAction func didTappedStart(_ sender: Any) {
settingsDelegate.didSelectReadingSpeed(counter: counter)
dismiss(animated: true, completion: nil)
}
TimerController
class TimerController: UIViewController, CountdownTimerDelegate, SettingsVCDelegate {
lazy var countdownTimer: CountdownTimer = {
let countdownTimer = CountdownTimer()
return countdownTimer
}()
var resetBtn: UIButton = {
let button = UIButton(type: .system)
button.addTarget(self, action: #selector(resetBtnDidTouch), for: .touchUpInside)
return button
}()
@objc func resetBtnDidTouch() {
countdownTimer.reset()
countdownTimer.setMinuteTimer(minutes: 0, seconds: counter)
countdownTimer.setHourTimer(hour: 0, minutes: 0, seconds: duration)
}
var counter = Int()
var isRunning = false
var resumeTapped = false
//MARK: - ViewDidLoad
override func viewDidLoad() {
super.viewDidLoad()
countdownTimer.delegate = self
countdownTimer.setMinuteTimer(minutes: 0, seconds: counter)
countdownTimer.setHourTimer(hour: 0, minutes: 0, seconds: duration)
}
//MARK: - Settings Delegate
func didSelectReadingSpeed(counter: Int) {
let counter = counter
countdownTimer.setMinuteTimer(minutes: 0, seconds: counter)
}
非常感谢有人能帮助我。
答案 0 :(得分:1)
您在代码中使用了三个(!)counter
变量
didSelectReadingSpeed
中的参数didSelectReadingSpeed
中的局部变量这非常令人困惑,因为所有三个对象都是不同的。为了避免命名混淆,例如,在委托方法speed
中使用参数(甚至可以在方法名称中省略Speed
)
protocol SettingsVCDelegate {
func didSelectReading(speed: Int)
}
发生此问题是因为其值用于重置计时器的属性从不发生更改。
解决方案:调用委托方法时,删除 局部变量 counter
并将speed
分配给 属性 counter
。
func didSelectReading(speed: Int) {
counter = speed
countdownTimer.setMinuteTimer(minutes: 0, seconds: counter)
}
两个注意事项:
Int()
,分配一个更具描述性的默认值:var counter = 0
。countdownTimer
看起来很酷,但是如果仅初始化属性是没有意义的。lazy var countdownTimer = CountdownTimer()
做同样的事情。答案 1 :(得分:0)
我同意先前的回答。此外,您还以分钟为单位声明和初始化了“计数器”。
countdownTimer.setMinuteTimer(minutes: counter, seconds: 0)
应该采用这种方式,或者如果“计数器”声明为秒:
minutes = counter / 60
seconds = counter % 60