2017-11-11 3 views
0

habe ich eine Klasse auf diesem Code basiert: https://gist.github.com/etartakovsky/06b8c9894458a3ff1b14Unbekannter Selektor an Instanz gesendet - Swift 3

Wenn ich versuche, um die Klasse zu instanziieren und die Zecke Methoden aufrufen, erhalte ich „Unbekannter Selektor gesendet Instanz“ Fehler. Ich überprüfte den Code immer und immer wieder, aber nicht verstehen, warum dies geschieht, wird jede Beratung geschätzt:

Stopwatch-Klasse Quelle:

import Foundation 
import QuartzCore 

class StopWatch: NSObject{ 

    private var displayLink: CADisplayLink! 
    private let formatter = DateFormatter() 

    var callback: (() -> Void)? 
    var elapsedTime: CFTimeInterval! 

    override init() { 
     super.init() 

     self.displayLink = CADisplayLink(target: self, selector: "tick:") 
     displayLink.isPaused = true 
     displayLink.add(to: RunLoop.main, forMode: RunLoopMode.commonModes) 

     self.elapsedTime = 0.0 

     formatter.dateFormat = "mm:ss,SS" 
    } 
    convenience init(withCallback callback: @escaping() -> Void) { 
     self.init() 
     self.callback = callback 
    } 
    deinit { 
     displayLink.invalidate() 
    } 

    func tick(sender: CADisplayLink) { 
     elapsedTime = elapsedTime + displayLink.duration 
     callback?() 
    } 

    func start() { 
     displayLink.isPaused = false 
    } 

    func stop() { 
     displayLink.isPaused = true 
    } 

    func reset() { 
     displayLink.isPaused = true 
     elapsedTime = 0.0 
     callback?() 
    } 

    func elapsedTimeAsString() -> String { 
     return formatter.string(from: Date(timeIntervalSinceReferenceDate:elapsedTime)) 
    } 

} 

Und hier ist der Viewcontroller-Code:

import UIKit 

class ActivityViewController: UIViewController { 

    let stopwatch = StopWatch() 

    @IBOutlet weak var elapsedTimeLabel: UILabel! 

    func tick() { 
     elapsedTimeLabel.text = stopwatch.elapsedTimeAsString() 
    } 

    override func viewDidLoad() { 

     super.viewDidLoad() 
     tick() 
     stopwatch.callback = self.tick 
     stopwatch.start() 


     // Do any additional setup after loading the view. 
    } 

} 
+0

https://stackoverflow.com finden/questions/39205613/selector-syntax-for-swift-3-0 – mmtootmm

Antwort

2

In Swift 3 verwenden, um die Syntax #selector

self.displayLink = CADisplayLink(target: self, selector: #selector(tick)) 

In Swift 4 ADDI tional müssen Sie @objc am Anfang der

Aktion einfügen
@objc func tick(... 
0

Versuchen Sie zwei Dinge. Verwenden Sie die neue (und sicherer) Selektor Syntax eingeführt durch Swift 3:

CADisplayLink(target: self, selector: #selector(tick(sender:))) 

und sicher sein, Ihre tick Methode in Objective-C (die rules have changed in Swift 4) aussetzen:

@objc func tick(sender: CADisplayLink) { 
    ... 
} 
+0

Die Parameterbezeichnung '(sender:)' im Selektor wird nicht benötigt. – vadian

+0

@vadian Ich benutze sie für extra Lesbarkeit;) Und wenn ich 'tick (this:)' und 'tick (that:)' habe, wie würde ich dann zwischen den beiden unterscheiden? –

0

Um zu verdeutlichen: unrecognized selector sent to instance ist ein Fehler in MessagePassing Szenario, das Mittel, um die gewünschte Auswahleinrichtung, die:

func tick(sender: CADisplayLink) {...}

und muss empfangen werden, wird die Nachricht nicht erkannt. Es kann nicht gefunden werden wegen der falschen Adressierung.

wie andere Mitglieder gesagt, müssen Sie Ihren Zielselektor durch #selector(tick) Zugabe ändern:

self.displayLink = CADisplayLink(target: self, selector: #selector(tick))

Sie weitere Informationen über den Fehler in diesem thread

Verwandte Themen