【问题标题】:how can I add multiple progress views to one timer so they all have separate times and when one goes off the next starts?如何将多个进度视图添加到一个计时器,以便它们都有不同的时间,并且当一个关闭时下一个开始?
【发布时间】:2022-01-03 00:49:58
【问题描述】:
//here is all of the code that I am using for this project
import UIKit
import AVFoundation

class ViewController: UIViewController {

    override func viewDidLoad() {
       super.viewDidLoad()
        // Do any additional setup after loading the view.
    

    
    }

    @IBAction func btnPressed4(_ sender: Any) {
        
            let currentDateTime = Date()
           let formatter = DateFormatter()
           formatter.timeStyle = .short
          let dateTimeString = formatter.string(from: currentDateTime)
        timePrint4.text = dateTimeString
        btnPressed4.titleLabel?.textColor = UIColor.white
    }
    
    
    
    @IBAction func btnPressed3(_ sender: Any) {
        
            let currentDateTime = Date()
           let formatter = DateFormatter()
           formatter.timeStyle = .short
          let dateTimeString = formatter.string(from: currentDateTime)
        timePrint3.text = dateTimeString
        btnPressed3.titleLabel?.textColor = UIColor.white
    }
    
    
    
    
    @IBAction func btnPressed2(_ sender: UIButton) {
    
        let currentDateTime = Date()
       let formatter = DateFormatter()
       formatter.timeStyle = .short
      let dateTimeString = formatter.string(from: currentDateTime)
        timePrint2.text = dateTimeString
        btnPressed2.titleLabel?.textColor = UIColor.green
    }
    
    
    
    
    
    
    
    @IBAction func btnPressed1(_ sender: UIButton) {
         let currentDateTime = Date()
        let formatter = DateFormatter()
        formatter.timeStyle = .short
       let dateTimeString = formatter.string(from: currentDateTime)
    timePrint1.text = dateTimeString
        
    }
    

 

    @IBOutlet weak var btnPressed1: UIButton!
    @IBOutlet weak var btnPressed2: UIButton!
    @IBOutlet weak var btnPressed3: UIButton!
    @IBOutlet weak var btnPressed4: UIButton!
    
    
    @IBOutlet weak var timePrint1: UILabel!
    @IBOutlet weak var timePrint2: UILabel!
    @IBOutlet weak var timePrint4: UILabel!
    
    @IBOutlet weak var timePrint3: UILabel!
    
    
  
    

    @IBOutlet weak var titleLabel: UILabel!
    
    @IBOutlet weak var progressBar1: UIProgressView!
    
    @IBOutlet weak var progressBar2: UIProgressView!
    
    @IBOutlet weak var progressBar3: UIProgressView!
    
    @IBOutlet weak var progressBar4: UIProgressView!
    
    
     let start = 5
    var timer = Timer()
    var player: AVAudioPlayer!
    var totalTime = 0
    var secondsPassed = 0
    
    @IBAction func startButtonPressed(_ sender: UIButton) {
    
   
        let startB = sender.titleLabel?.text
        totalTime = start
           
        
        
        progressBar1.progress = 0.0
        secondsPassed = 0
        titleLabel.text = "coffee timer"
        btnPressed1.titleLabel?.textColor = UIColor.white
        timer = Timer.scheduledTimer(timeInterval: 1.0, target:self, selector: #selector(updateTimer), userInfo:nil, repeats: true)
    }
    
    @objc func updateTimer() {
        if secondsPassed < totalTime {
            secondsPassed += 1
            progressBar1.progress = Float(secondsPassed) / Float(totalTime)
            print(Float(secondsPassed) / Float(totalTime))
        } else {
            timer.invalidate()
            titleLabel.text = "check coffee"
            btnPressed1.titleLabel?.textColor = UIColor.green
           
            let url = Bundle.main.url(forResource: "alarm_sound", withExtension: "mp3")
            player = try! AVAudioPlayer(contentsOf: url!)
            player.play()
            
        
         
        
        }
               
    
    }
}
//I have four progress views and when the first ends a alarm goes off and then the next starts eminently and the goes to the next and then to the fourth one were the timer ends after that

【问题讨论】:

  • 我建议使用多个计时器。当您使一个无效时,开始下一个。他们每个人都有自己的进度更新逻辑。

标签: ios swift


【解决方案1】:

有很多不同的方法来处理这个问题。以下是一种可能的方法的概要:

有一个currentProgress 类型的实例变量Int? 如果它为nil,则您的进度指示器都没有运行。

有一个实例变量stepCompletedInterval: Double

创建一个结构来保存用于管理进度步骤的不同视图:

struct ProgressInfo {
   let aButton: UIButton
   let aLabel: UILabel
   let aProgressIndicator: UIProgressIndicator
   let secondsForThisStep: Int
}

创建一个ProgressInfo 数组(我们称之为progressInfoArray)并使用上面的按钮、标签和进度指示器填充它。还为每个条目指定 secondsForThisStep 的值。

当用户启动进程时,将 currentProgress 设置为 0(第一个进度指示器。)

现在,对于每个步骤,将 stepCompletedInterval 设置为当前时间加上 progressInfoArray[currentProgress].secondsForThisStep(当前步骤应完成的时间。

同时启动一个 1 秒的重复计时器。每次定时器触发时,检查当前时间是否大于 stepCompletedInterval。如果是,如果还有更多步骤要完成,则增加 currentProgress,并重复上面的“每个步骤的现在”部分。

这是你如何去做的一个粗略的概述。我不完全清楚你的开始按钮和btnPressed1btnPressed4 应该做什么,所以我把它留给你。

您需要根据您的需要调整我概述的方法。这不是代码,而是一种方法。我不会给你代码。

【讨论】:

  • 我不明白你刚才说的一半,因为我是 swift 新手。
  • 任何时候你发现自己编写了多个函数来对不同的对象集执行完全相同的操作,这就是“代码味道”,并且表明有更好的方法可以做到这一点。您的 btnPressed1 - btnPressed4 方法是可以重构的重复代码示例。
  • 好的,我将如何重构它们
  • 通过重组代码来管理结构数组,如上所述。
  • 我该怎么做?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多