读取NSTimer的子类的公共var有效失败,仅为抽象类定义了#is; isValid'

时间:2016-04-08 10:52:26

标签: ios swift abstract-class nstimer subclassing

我创建了一个NSTimer的子类,它将(我希望)暂停和恢复函数添加到scheduledTimerWithTimeInterval函数。

class HCTimer: NSTimer {

    var hcTimerInterval :NSTimeInterval!
    var hcTarget :AnyObject!
    var hcSelector :Selector!
    var hcUserInfo :AnyObject!
    var hcRepeats :Bool!
    var hcTimer :HCTimer!

    class func pausableScheduledTimerWithTimeInterval(ti: NSTimeInterval, target aTarget: AnyObject, selector aSelector: Selector, userInfo: AnyObject?, repeats yesOrNo: Bool) -> HCTimer {

        let hcInstanceTimer = super.scheduledTimerWithTimeInterval(ti,target: aTarget, selector: aSelector, userInfo: userInfo, repeats: yesOrNo) as! HCTimer

        hcInstanceTimer.hcTimerInterval = ti
        hcInstanceTimer.hcTarget = aTarget
        hcInstanceTimer.hcSelector = aSelector
        hcInstanceTimer.hcUserInfo = userInfo!
        hcInstanceTimer.hcRepeats = yesOrNo
        hcInstanceTimer.hcTimer = hcInstanceTimer

        return hcInstanceTimer
    }

    func pause() {
        self.invalidate()
    }

    func resume() {
        self.hcTimer = HCTimer.pausableScheduledTimerWithTimeInterval(hcTimerInterval, target: hcTarget, selector: hcSelector, userInfo: hcUserInfo, repeats: hcRepeats)
    }
}

要在现有的viewController中使用新类,我用HCTimer替换了NSTimer类型的现有属性。按下按钮且定时器无效时启动定时器。

class ViewController: UIViewController {

    var severityButtonTimer = HCTimer()

    @IBAction func sortOnSeverityButtonTouchInside(sender: UIButton) {

        // Start animation if none running
        if (!severityButtonTimer.valid) {
            // Change sort order

代码编译成功,但当函数值'#39;有效'读取HCTimer实例失败,但出现以下异常。

2016-04-08 12:03:25.234 homecaremonitor[45750:17518480] *** Terminating app     due to uncaught exception 'NSInvalidArgumentException', reason: '*** -isValid only defined for abstract class.  Define -[homecaremonitor.HCTimer isValid]!'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010f4c5d85     __exceptionPreprocess + 165
    1   libobjc.A.dylib                     0x0000000111269deb objc_exception_throw + 48
    2   CoreFoundation                      0x000000010f4c5cbd +[NSException raise:format:] + 205
    3   Foundation                          0x000000010f9477b9 NSRequestConcreteImplementation + 229
    4   Foundation                          0x000000010f95aa19 -[NSTimer(NSTimer) isValid] + 39
    5   homecaremonitor                     0x000000010ef43f78 

仍然试图解决此问题,任何帮助表示赞赏! 干杯, 彼得

根据Wain的建议将子类HCTimer替换为HCTimerWrapper

class HCTimerWrapper {

    var hcTimerInterval :NSTimeInterval!
    var hcTarget :AnyObject!
    var hcSelector :Selector!
    var hcUserInfo :AnyObject!
    var hcRepeats :Bool!
    var hcTimer :NSTimer!
    var valid : Bool {
        get {
            if hcTimer != nil  {
                return hcTimer.valid
            } else {
                return false
            }
        }
    }

    func pausableScheduledTimerWithTimeInterval(ti: NSTimeInterval, target aTarget: AnyObject, selector aSelector: Selector, userInfo: AnyObject?, repeats yesOrNo: Bool) {

        let hcInstanceTimer = NSTimer.scheduledTimerWithTimeInterval(ti,target: aTarget, selector: aSelector, userInfo: userInfo, repeats: yesOrNo)

        self.hcTimerInterval = ti
        self.hcTarget = aTarget
        self.hcSelector = aSelector
        self.hcUserInfo = userInfo!
        self.hcRepeats = yesOrNo
        self.hcTimer = hcInstanceTimer  
    }

    func pause() {
        self.hcTimer.invalidate()
    }

    func resume() {
        self.hcTimer = NSTimer.scheduledTimerWithTimeInterval(self.hcTimerInterval, target: self.hcTarget, selector: self.hcSelector, userInfo: self.hcUserInfo, repeats: self.hcRepeats)
    }
}

1 个答案:

答案 0 :(得分:3)

不要创建NSTimer的子类,创建一个公开所需功能的包装器。您的代码中已经存在一些关于hcTimer以及它是什么以及用于什么的混淆(我希望这还没有变得明显),您的包装器也可以避免这种情况。

因此,您的包装器可选地包含NSTimer实例。永远不要致电NSTimer() - 这实际上是您的代码目前正在做的事情。您应该没有计时器,或者您应该有一个完全创建和计划的计时器实例。