此应用程序的逻辑正在运行,但计时器无法正常运行。我有三个文件:ViewController.Swift,clock.swift和clockstylekit.swift。
位于clock.swift文件中的updateTime()拉动时间,将其分解为其组件,并返回小时,分钟和秒,并召唤drawRect重绘当前的可视化表示。
import UIKit
import Foundation
class timeUpdate: UIView {
func updateTime() -> (Int, Int, Int) {
var date:NSDate = NSDate()
var calendar:NSCalendar = NSCalendar.currentCalendar()
var components:NSDateComponents = calendar.components(NSCalendarUnit.CalendarUnitHour | NSCalendarUnit.CalendarUnitMinute | NSCalendarUnit.CalendarUnitSecond, fromDate: date)
var hour = components.hour
var minute = components.minute
var second = components.second
setNeedsDisplay()
return (hour, minute, second)
}
}
同样位于clock.swift文件中的drawRect()方法将时间组件绘制到UIView:
class clock: UIView {
override func drawRect(rect: CGRect) {
let (hour, minute, second) = timeUpdate().updateTime()
switch hour {
case 0:
ClockStyleKit.drawCanvas0()
case 01, 13:
ClockStyleKit.drawCanvas0()
ClockStyleKit.drawCanvas01()
.....etc etc
}
}
这是我正在使用的计时器:
var timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("updateTime"), userInfo: nil, repeats: true)
当我将它放入ViewController viewDidLoad函数时,我得到一个无法识别的选择器错误。当我将它放入我的clock.swift文件中的函数时,我可以编译而没有任何错误,时间被正确更新,但它只运行一次而不更新。这个计时器应该去哪里?
答案 0 :(得分:0)
如果var timer = NSTimer...
代码在ViewController函数中,则self
将成为ViewController
。在你的计时器中,你将目标设置为等于self
,因此它将在你的ViewController中寻找一个名为updateTime
的方法,它不存在,因为它在TimeUpdate
类中。此外,您的选择器的签名是错误的。你正在调用updateTime()
,但是它想要调用一个带有NSTimer参数的选择器来返回一个void,所以你需要调用一个带有这个签名的例程:
func firedTimerMethod(timer: NSTimer)
重读Xcode中文档中NSTimer
的说明。
答案 1 :(得分:0)
计时器功能的签名错误。根据文档,选择器必须具有以下签名:
- (void)timerFireMethod:(NSTimer *)timer
所以你需要创建一个类似于:
的计时器方法 func updateTime(time:NSTimer) {
// your code here
}
然后使用Selector(updateTime:)
我建议您只需让计时器请求时钟显示进行刷新,并在显示代码中计算显示之前的时间。
答案 2 :(得分:0)
我必须做的是将我的计时器放在我的viewcontroller中,如下所示:
class ViewController: UIViewController {
var timer = NSTimer()
override func viewDidLoad() {
super.viewDidLoad()
self.timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("firedTimerMethod:"), userInfo: nil, repeats: true)
}
@objc func firedTimerMethod(timer: NSTimer) {
println("firedTimerMethod fired")
let clockView = self.view as! clock
clockView.setNeedsDisplay()
}
}
定时器的选择器功能需要NSTimer参数@objc,我必须将变量转换为时钟类。一旦我做了这些事情,drawRect现在正确地更新计时器运行的每一秒。我感谢大家的帮助,所有各种线索最终让我走上正轨。