2016-05-11 6 views
0

Ich habe eine Timer-Klasse zu feuern, wenn die ViewDidLoad(). Ich möchte einen Timer für mehrere View-Controller über die App haben. Wenn Sie eine bessere Lösung für einen genauen Timer für mehrere Ansichten haben, schlagen Sie bitte vor.NSTimer nicht schießen propery

Viewcontroller -> Eine der Ansichten, die einen Timer

override func viewDidLoad() { 
super.viewDidLoad() 

    func setupTimer() { 

     // Setupt the timer, this will call the timerFired method every second 
     var timer = NSTimer(
      timeInterval: 1.0, 
      target: self, 
      selector: #selector(TestTimer.timerFired()),//<- Error Code 
      userInfo: nil, 
      repeats: true) 
     } 

Der Fehlercode benötigt: Verwendung von Instanz Mitglied ‚timerFired‘ vom Typ ‚TestTimer‘, meinen Sie einen Wert vom Typ ‚verwenden TestTimer ' stattdessen?

Timer-Klasse -> Prüft Starttermin im Vergleich zum aktuellen Datum/Zeit für eine genaue Timer

class TestTimer: NSTimer { 

var timer = NSTimer() 
// Converter changes String into NSDate 
var startDate = converter("Tue, 26 Apr 2016 09:01:00 MDT") 
// Function to be fired 
func timerFired() { 

    let now = NSDate() 
    let difference = now.timeIntervalSinceDate(self.startDate) 


    // Format the difference for display 
    // For example, minutes & seconds 
    let dateComponentsFormatter = NSDateComponentsFormatter() 
    dateComponentsFormatter.stringFromTimeInterval(difference) 
    print(difference) 

} 
} 
+1

Was versuchen Sie eigentlich, wenn der Timer ausgelöst wird? vermutlich nicht nur drucken ... – Wain

+1

Entferne das '()' vom Ende deines 'timerFired' im' # Selector'. Sie sollten jedoch beachten, dass dies immer noch nicht funktioniert, da sich "selbst" in diesem Kontext auf den View-Controller bezieht, nicht auf den Timer. Du musst deine Logik überdenken. – Hamish

+0

Wenn Sie uns sagen können, warum Sie den tatsächlichen Zeitunterschied zwischen den Timer-Aufrufen für die Genauigkeit benötigen, können wir Ihnen möglicherweise helfen, eine Lösung zu finden. Ich vermute, dass Sie hier nicht einmal "NSTimer" verwenden möchten, da sie überhaupt nicht auf Genauigkeit ausgelegt sind. – Hamish

Antwort

1

Der Fehler Sie bekommen hübsch obskur. Was es Ihnen zu sagen versucht, ist, dass Sie die () vom Ende Ihrer timerFired in der #selector entfernen sollten.

var timer = NSTimer(
    timeInterval: 1.0, 
    target: self, 
    selector: #selector(TestTimer.timerFired), 
    userInfo: nil, 
    repeats: true) 

Doch dies wird nicht der Code machen, wie Sie es arbeiten wollen - wie self in der Timer-Erklärung bezieht sich auf den View-Controller, nicht der Timer. Ich würde Ihnen empfehlen, eine Wrapper-Klasse für NSTimer zusammen mit einem Delegatenmuster zu erstellen, um zu erreichen, was Sie wollen.

sollten Sie beachten, dass the documentation states, dass Sie sollten nicht zu Unterklasse NSTimer versuchen, so könnte man stattdessen so etwas tun:

// the protocol that defines the timerDidFire callback method 
protocol TimerDelegate:class { 
    func timerDidFire(cumulativeTime:NSTimeInterval) 
} 

// your timer wrapper class 
class TimerWrapper { 

    // the underlying timer object 
    weak private var _timer:NSTimer? 

    // the start date of when the timer first started 
    private var _startDate = NSDate() 

    // the delegate used to implement the timerDidFire callback method 
    weak var delegate:TimerDelegate? 

    // start the timer with a given firing interval – which could be a property 
    func startTimer(interval:NSTimeInterval) { 

     // if timer already exists, make sure to stop it before starting another one 
     if _timer != nil { 
      stopTimer() 
     } 

     // reset start date and start new timer 
     _startDate = NSDate() 
     _timer = NSTimer.scheduledTimerWithTimeInterval(interval, 
                 target: self, 
                 selector: #selector(timerDidFire), 
                 userInfo: nil, repeats: true) 
    } 

    // invalidate & deallocate the timer, 
    // make sure to call this when you're done with the timer 
    func stopTimer() { 
     _timer?.invalidate() 
     _timer = nil 
    } 

    // make sure to stop the timer when the wrapper gets deallocated 
    deinit { 
     stopTimer() 
    } 

    // called when the timer fires 
    @objc func timerDidFire() { 

     // get the change in time, from when the timer first fired to now 
     let deltaTime = NSDate().timeIntervalSinceDate(_startDate) 

     // do something with delta time 

     // invoke the callback method 
     delegate?.timerDidFire(deltaTime) 
    } 
} 

Sie können es dann wie folgt verwenden:

// your view controller class – make sure it conforms to the TimerDelegate 
class ViewController: UIViewController, TimerDelegate { 

    // an instance of the timer wrapper class 
    let timer = TimerWrapper() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // set the timer delegate and start the timer – delegate should be set in viewDidLoad, 
     // timer can be started whenever you need it to be started. 
     timer.delegate = self 
     timer.startTimer(1) 
    } 

    func timerDidFire(cumulativeTime: NSTimeInterval) { 

     // do something with the total time 

     let dateComponentsFormatter = NSDateComponentsFormatter() 
     let text = dateComponentsFormatter.stringFromTimeInterval(cumulativeTime) 
     label.text = text 
    } 
} 

Soweit die Angemessenheit der Verwendung einer NSTimer hier geht, wie Sie nur ein Zeitintervall von 1 Sekunde verwenden, ist eine NSTimer geeignet. Indem Sie das Zeitintervall über die gesamte Timer-Dauer nehmen, können Sie kleine Brennungenauigkeiten ausgleichen.

+0

Ich schätze Ihre Arbeit daran, ich habe noch nie einen Wrapper verwendet.Ich glaube, ich verstehe die Klasse TimerWrapper Abschnitt des Codes, aber ich habe Probleme bei der Umsetzung. Wo würde ich diesen Code verwenden? AnsichtDidLoad? @ originaluser2 –

+0

"timer.delegate = self" ist, was ich habe die meisten Probleme mit, das macht Sinn, aber ich habe Schwierigkeiten, es auf dem Spielplatz oder meinem Projekt –

+0

@ Ring-Jarvi Ich habe meine Antwort ausgearbeitet mit extra Kontext auf seine Verwendung und Kommentare - hoffentlich, dass beseitigt alle Probleme, die Sie damit haben :) – Hamish

0

Dies ist, wie ein Timer

var timer = NSTimer.scheduledTimerWithTimeInterval(1.0 , target: self, selector: #selector(TestTimer.timerFired()), userInfo: nil, repeats: true) 
initialisiert
+0

Ich bekomme den gleichen Fehlercode –