Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何使NSTimer显示小时:分钟:秒_Ios_Swift_Nstimer - Fatal编程技术网

Ios 如何使NSTimer显示小时:分钟:秒

Ios 如何使NSTimer显示小时:分钟:秒,ios,swift,nstimer,Ios,Swift,Nstimer,我试图让计时器显示以下时间:小时:分钟:秒:毫秒。我发现一个网站教程展示了如何做,但它没有显示时间。以下是网站: 下面是它说要执行的代码: var timer = NSTimer() var startTime = NSTimeInterval() func updateTime() { var currentTime = NSDate.timeIntervalSinceReferenceDate() var elapsedTime : NSTimeInterval = cur

我试图让计时器显示以下时间:小时:分钟:秒:毫秒。我发现一个网站教程展示了如何做,但它没有显示时间。以下是网站:

下面是它说要执行的代码:

var timer = NSTimer()
var startTime = NSTimeInterval()

func updateTime()
{
    var currentTime = NSDate.timeIntervalSinceReferenceDate()
    var elapsedTime : NSTimeInterval = currentTime - startTime

    let minutes = UInt8(elapsedTime / 60.0)
    elapsedTime -= (NSTimeInterval(minutes) * 60)

    let seconds = UInt8(elapsedTime)
    elapsedTime -= NSTimeInterval(seconds)

    let fraction = UInt8(elapsedTime * 100)

    let strMinutes = String(format: "%02d", minutes)
    let strSeconds = String(format: "%02d", seconds)
    let strFraction = String(format: "%02d", fraction)

    timeLabel.text = "\(strMinutes):\(strSeconds):\(strFraction)"
}

@IBAction func start(sender: AnyObject) {
    if !timer.valid {
        let aSelector : Selector = “updateTime”
        timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: aSelector, userInfo: nil, repeats: true)
        startTime = NSDate.timeIntervalSinceReferenceDate()
    }
}

@IBAction func stop(sender: AnyObject) {
    timer.invalidate()
}
我不完全理解
updateTime()
函数中发生了什么。我不明白它是如何把自己转换成分钟,秒。。。如果有人能给我一个解释,我将不胜感激

我的目标是增加时间,但我也希望完全了解发生了什么。

试试这个:

var timer = NSTimer()
var startTime = NSTimeInterval()

func updateTime()
{
    var currentTime = NSDate.timeIntervalSinceReferenceDate()
    var elapsedTime : NSTimeInterval = currentTime - startTime

    let hours = UInt8(elapsedTime / 3600.0)
    elapsedTime -= (NSTimeInterval(hours) * 3600)

    let minutes = UInt8(elapsedTime / 60.0)
    elapsedTime -= (NSTimeInterval(minutes) * 60)

    let seconds = UInt8(elapsedTime)
    elapsedTime -= NSTimeInterval(seconds)

    let strHours = String(format: "%02d", hours)
    let strMinutes = String(format: "%02d", minutes)
    let strSeconds = String(format: "%02d", seconds)
    let strFraction = String(format: "%02d", fraction)

    timeLabel.text = "\(strHours):\(strMinutes):\(strSeconds)"
}

elapsedTime
以秒为单位,例如
elapsedTime=5000秒
。一小时有3600秒,所以你把它除以3600,四舍五入到最近的一小时。现在
hours=1
。然后减去3600秒:
elapsedTime=1400
。然后除以60,四舍五入得到分钟数(
minutes=23
)。然后你再减去一次,得到秒数
elapsedTime=1400-23*60=20秒

我将一步一步地指导你需要做什么

前几行提取从当前时间到初始时间的时间间隔(以秒为单位):

var currentTime = NSDate.timeIntervalSinceReferenceDate()
var elapsedTime : NSTimeInterval = currentTime - startTime
我想这些线是显而易见的。接下来,您要计算经过了多少小时

为此,您需要添加:

let hours = UInt8(elapsedTime / 3600.0)
这行之所以有效,是因为
elapsedTime
是以秒为单位测量的。一小时有3600秒。将
elapsedTime
除以3600,得到小时数。但是,这个数字可以是小数。例如,半小时对应1800秒,如果将1800除以3600,则得到0.5。你需要把这四舍五入得到0。为此,您使用
UInt8()
构造函数。它将数字向下舍入到最小整数。在我的示例中,UInt8(0.5)等于零

然后对其他组件使用相同的逻辑,注意一分钟内有60秒(这就是为什么要除以60)

在这些调用之间减少
elapsedTime
的值:

elapsedTime -= (NSTimeInterval(hours) * 3600)
因为您需要从
elapsedTime
中删除与小时数相对应的秒数。否则,当你开始计算分钟数时,你最终会计算出一个更大的数值。例如,如果
elapsedTime
等于3660(1小时1分钟),除非扣除3600,否则将得到61分钟

总的来说,对于您的应用程序,函数如下所示:

func updateTime()
{
    var currentTime = NSDate.timeIntervalSinceReferenceDate()
    var elapsedTime : NSTimeInterval = currentTime - startTime

    let hours = UInt8(elapsedTime / 3600.0)
    elapsedTime -= (NSTimeInterval(hours) * 3600)

    let minutes = UInt8(elapsedTime / 60.0)
    elapsedTime -= (NSTimeInterval(minutes) * 60)

    let seconds = UInt8(elapsedTime)
    elapsedTime -= NSTimeInterval(seconds)

    let fraction = UInt8(elapsedTime * 100)

    let strMinutes = String(format: "%02d", minutes)
    let strSeconds = String(format: "%02d", seconds)
    let strFraction = String(format: "%02d", fraction)

    timeLabel.text = "\(strMinutes):\(strSeconds):\(strFraction)"
}
关于为什么扣除时间很重要的更多信息 让我们假设您的elapsedTime等于3660秒,即1小时1分钟

该行:

let hours = UInt8(elapsedTime / 3600.0)
将正确计算小时数为1。下一行:

elapsedTime -= (NSTimeInterval(hours) * 3600)
elapsedTime
的值中减去1*3600,使其等于60。这样做的目的是删除那些不应用于计算分钟数的秒数,因为它们已经用小时表示

假设您不这样做,您就可以排队了:

let minutes = UInt8(elapsedTime / 60.0)
如果您的
elapsedTime
仍然等于3660,则此行将使
minutes
等于61。你显然不想那样

但是,如果扣除小时数,
elapsedTime
等于60,上面的一行将使分钟数等于1。输出将是01:01,而不是01:61


我希望这能澄清问题。

哦!因此变量
elapsedTime
是以秒为单位的实际时间量。然后剩下的就是将
elapsedTime
转换为min,secs。。。我说的对吗?因此一天就要过去了。时间/86400?@MikeRally你说的绝对正确。在计算了天数之后,不要忘记从elapsedTime中扣除numDays*86400,否则您可能会得到36小时:)我不太理解elapsedTime-=(NtimeInterval(hours)*3600)@Mikrally检查更新的答案。我在底部添加了一个部分,详细描述了这一点的重要性