NSTimer,setNeedsDisplay,无法识别的选择器问题

时间:2015-05-18 21:16:05

标签: ios swift cocoa-touch nstimer

此应用程序的逻辑正在运行,但计时器无法正常运行。我有三个文件: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文件中的函数时,我可以编译而没有任何错误,时间被正确更新,但它只运行一次而不更新。这个计时器应该去哪里?

3 个答案:

答案 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现在正确地更新计时器运行的每一秒。我感谢大家的帮助,所有各种线索最终让我走上正轨。