NSTimer'in bir alt sınıfını oluşturdum (umarım), planlananTimeWithTimeInterval işlevini duraklatıp devam ettirir. NSTimer alt sınıfının geçerli genel varsayısı, 'sadece' soyut sınıf 'için tanımlanmış olan isValid' ile başarısız olur
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)
}
}
mevcut ViewController içinde yeni bir sınıf kullanmak için i HCTimer tip NSTimer mevcut özelliklerini değiştirdi. Zamanlayıcı, bir düğmeye basıldığında ve zamanlayıcı geçerli olmadığında başlatılır.
class ViewController: UIViewController {
var severityButtonTimer = HCTimer()
@IBAction func sortOnSeverityButtonTouchInside(sender: UIButton) {
// Start animation if none running
if (!severityButtonTimer.valid) {
// Change sort order
kodu başarıyla derler ama işlevi HCTimer örneğinin 'geçerli' değer okunduğunda aşağıdaki istisna ile başarısız olur.
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
Yine de bunu düzeltmeye çalışıyorsanız, herhangi bir yardım için teşekkür ederiz! İhtiyacınız işlevselliği sunar bir sarmalayıcı oluşturmak, NSTimer
bir alt sınıfını oluşturmayın Wain
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)
}
}
Bu, ifadenizi destekler: http://lists.apple.com/archives/cocoa-dev/2006/Nov/msg00389.html. Görünüşe göre, NSTimer bir sınıf kümesinin (bir parçası). –
Ayrıca, NSTimer dokümanlarındaki alt sınıflandırma notlarına bakınız: "NSTimer alt sınıfını denememelisiniz." https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSTimer_Class/index.html –