从委托函数Swift 4中提取值

时间:2018-08-12 15:05:54

标签: ios swift xcode swift4

我需要有关委托和协议问题背后的逻辑的帮助。我制作了一个计时器应用程序,可让您设置计时器。计时器选择位于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)
}

非常感谢有人能帮助我。

2 个答案:

答案 0 :(得分:1)

您在代码中使用了三个(!)counter变量

  1. 顶级属性
  2. didSelectReadingSpeed中的参数
  3. didSelectReadingSpeed中的局部变量

这非常令人困惑,因为所有三个对象都是不同的。为了避免命名混淆,例如,在委托方法speed中使用参数(甚至可以在方法名称中省略Speed

protocol SettingsVCDelegate {
    func didSelectReading(speed: Int)
}

发生此问题是因为其值用于重置计时器的属性从不发生更改。

解决方案:调用委托方法时,删除 局部变量 counter并将speed分配给 属性 counter

func didSelectReading(speed: Int) {
    counter = speed
    countdownTimer.setMinuteTimer(minutes: 0, seconds: counter)
}

两个注意事项:

  • 请勿使用默认的初始化程序初始化 scalar 属性,例如Int(),分配一个更具描述性的默认值:
    var counter = 0
  • 使用闭包初始化countdownTimer看起来很酷,但是如果仅初始化属性是没有意义的。
    lazy var countdownTimer = CountdownTimer()做同样的事情。

答案 1 :(得分:0)

我同意先前的回答。此外,您还以分钟为单位声明和初始化了“计数器”。

countdownTimer.setMinuteTimer(minutes: counter, seconds: 0)应该采用这种方式,或者如果“计数器”声明为秒:

minutes = counter / 60
seconds = counter % 60