【问题标题】:Swift Progress View with NSTimer使用 NSTimer 的 Swift 进度视图
【发布时间】:2016-03-09 17:17:39
【问题描述】:

我有一个进度视图栏,我想用它来指示时间。这是我在 Swift 中的第一个项目,我不确定如何去做。所以任何帮助/建议将不胜感激......

(使用 Xcode 7.2 和 Swift 2.0)

下面是我的视图控制器。当 'btnPlaySession' 被触发时,视图控制器上的内容每 20 秒改变一次。当计时器计数到 20 时,id 喜欢用进度条指示这一点(因此进度条会在每次内容更改时重置)。

class CreatedSessionViewController: UIViewController {

var createdSession: [YogaPose]!
var poseDuration: Double = 20.00 
var timer = NSTimer!()
var currentPoseIndex = 1

//Outlets:
@IBOutlet var poseProgressView: UIProgressView!
@IBOutlet var lblPoseCount: UILabel!
@IBOutlet var lblPoseName: UILabel!
@IBOutlet var imgPose: UIImageView!
@IBOutlet var tvDescription: UITextView!

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

    displayFirstPoseInArray()
}

func displayFirstPoseInArray(){
    lblPoseCount.text = (String(currentPoseIndex) + "/" + String(createdSession.count))
    lblPoseName.text = createdSession[0].title
    imgPose.image = UIImage(named: String(format: "%d.jpg", (createdSession[0].id)!))
    tvDescription.text = createdSession[0].desc
}

@IBAction func btnPlaySession(sender: AnyObject) {
    timer = NSTimer.scheduledTimerWithTimeInterval(poseDuration, target: self, selector: "getNextPoseData", userInfo: nil, repeats: true)
}

func getNextPoseData(){
    if (currentPoseIndex < createdSession.count){

        setProgressBar()

        lblPoseCount.text = (String(currentPoseIndex + 1) + "/" + String(createdSession.count))
        lblPoseName.text = createdSession[currentPoseIndex].title
        imgPose.image = UIImage(named: String(format: "%d.jpg",(createdSession[currentPoseIndex].id)!))
        tvDescription.text = createdSession[currentPoseIndex].desc
        currentPoseIndex += 1
        print(currentPoseIndex)
    }
}

func setProgressBar(){


}
}

【问题讨论】:

    标签: swift progress-bar nstimer uiprogressview nstimeinterval


    【解决方案1】:

    好的 - 所以如果你希望进度条每秒更新一次,那么你需要一个每秒触发一次的计时器 - 但它会执行 20 次,并调用 setProgressBar 作为选择器而不是 getNextPoseData

    setProgressBar内,你需要增加一个类级别的属性,也许indexProgressBar,只需将进度条属性progress设置为1.0 / indexProgressBar

    如果indexProgressBar == 20,则调用getNextPoseData,并重置您的进度条

    这里有一个简化的版本,说明你可以如何做到这一点

    class ViewController: UIViewController
    {
        @IBOutlet weak var progressBar: UIProgressView!
        var timer = NSTimer!()
        var poseDuration = 20
        var indexProgressBar = 0
        var currentPoseIndex = 0
    
        override func viewDidLoad()
        {
            super.viewDidLoad()
    
            // initialise the display
            progressBar.progress = 0.0
        }
    
    
        @IBAction func cmdGo(sender: AnyObject)
        {
            // display the first pose
            getNextPoseData()
    
            // start the timer
            timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: "setProgressBar", userInfo: nil, repeats: true)
        }
    
        func getNextPoseData()
        {
            // do next pose stuff
            currentPoseIndex += 1
            print(currentPoseIndex)
        }
    
        func setProgressBar()
        {
            if indexProgressBar == poseDuration
            {
                getNextPoseData()
    
                // reset the progress counter
                indexProgressBar = 0
            }
    
            // update the display
            // use poseDuration - 1 so that you display 20 steps of the the progress bar, from 0...19
            progressBar.progress = Float(indexProgressBar) / Float(poseDuration - 1)
    
            // increment the counter
            indexProgressBar += 1
        }
    }
    

    【讨论】:

    • 效果很好。为帮助干杯:)
    • 最小值是多少?
    • 最小的时间间隔比您在刷新中想要的要小得多 - 来自 AppleDocs 计时器触发之间的秒数。如果 小于或等于 0.0,则此方法选择 0.0001 秒的非负值。
    【解决方案2】:

    继续加载器

    func setProgress() {
        time += 0.1
        ProgressBar.setProgress(time / 3, animated: true)
        if time >= 3 {
            self.time = 0.01
            ProgressBar.progress = 0
            let color = self.downloadProgressBar.progressTintColor
            self.downloadProgressBar.progressTintColor = self.downloadProgressBar.trackTintColor
            self.downloadProgressBar.trackTintColor = color
        }
    

    【讨论】:

      猜你喜欢
      • 2014-08-13
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      相关资源
      最近更新 更多