私は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)
}
}
これは次の文をサポートしています:http://lists.apple.com/archives/cocoa-dev/2006/Nov/msg00389.html明らかに、NSTimerはクラスクラスタの一部です。 –
また、NSTimerのサブクラスのノートを参照してください。ここでは、NSTimerをサブクラス化しようとしないでください。 https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/index.html –