2016-04-08 4 views
0

私はNSTimerのサブクラスを作成して、scheduleTimerWithTimeInterval関数にポーズとレジューム関数を追加しました。読み込みpublic var NSTimerのサブクラスのバリデーションが失敗しました 'abstractValueクラスは抽象クラスにのみ定義されています'

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 

コードが正常にコンパイルが、関数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 

これを修正しようとしても、何か助けてください!ウェイン

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) 
    } 
} 

答えて

3

によってadvicedよう 乾杯、 ピーター

はあなたが必要とする機能を公開するラッパーを作成し、NSTimerのサブクラスを作成しないでくださいHCTimerWrapperとサブクラスHCTimerを置き換え。 hcTimerについてのコードにはすでに混乱がありますが、それは何か(これはまだ明らかにならないと思います)、あなたのラッパーもそれを避けることができます。

したがって、ラッパーにはオプションでNSTimerインスタンスが含まれます。 NSTimer()には絶対に電話しないでください。これはあなたのコードが現在行っていることです。タイマーがないか、完全に作成されてスケジュールされたタイマーインスタンスが必要です。

+1

これは次の文をサポートしています:http://lists.apple.com/archives/cocoa-dev/2006/Nov/msg00389.html明らかに、NSTimerはクラスクラスタの一部です。 –

+1

また、NSTimerのサブクラスのノートを参照してください。ここでは、NSTimerをサブクラス化しようとしないでください。 https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/index.html –

関連する問題