2016-04-08 30 views
0

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

cevap

3

tarafından tavsiye olarak Alkış, Peter

HCTimerWrapper ile alt sınıfı HCTimer değiştirildi. Kodunuzda zaten hcTimer ile ilgili bir karışıklık var ve bunun ne için kullanıldığını ve bunun için kullanıldığını (bunun henüz belirgin olmadığına inanıyorum), sarıcınız da bundan kaçınabilir.

Bu nedenle, sarıcınız isteğe bağlı olarak NSTimer örneğini içerecektir. Asla NSTimer()'u aramayın - bu, kodunuzun şu anda ne yaptığını etkili bir şekilde gösterir. Ya zamanlayıcınız olmamalı ya da tam olarak oluşturulmuş ve programlanmış zamanlayıcı örneğiniz olmalıdır.

+1

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ı). –

+1

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 –