2015-01-12 14 views
10

Ich möchte einen NSTimer in einer Klasse verwenden, die nicht von UIViewVontroller erbt. Ich habe 2 Dateien: ein Viewcontroller und ein TimerClass wie folgt aus:NSTimer kann Selektor nicht finden

Viewcontroller:

import UIKit 

class ViewController: UIViewController { 

    var timerClass = TimerClass() 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func viewDidAppear(animated: Bool) { 
     timerClass.launchTimer() 
    } 

} 

TimerClass:

import Foundation 

class TimerClass { 

    var timer = NSTimer() 

    init(){} 

    func launchTimer(){ 
     var timer = NSTimer.scheduledTimerWithTimeInterval(2, target: self, selector: "timerEnd", userInfo: nil, repeats: true) 
    } 

    func timerEnd(){ 
     println("That worked") 
    } 
} 

Als ich diese App starten, ich habe einen Absturz mit:

2015-01-12 19: 48: 24.322 Timer_TEST [5829: 185651] *** NSForwarding: Warnung: Objekt 0x7fbc3be20710 der Klasse 'Timer_TEST.TimerClass' implementiert methodSignatureForSelector nicht: - trouble ahead Nicht erkannter Wahlschalter - [Timer_TEST.supportFile timerEnd]

Irgendeine Idee?

Danke

+0

Ich weiß sehr wenig über Swift, aber es fragt nach einer Methode und es ist nicht in Ihrer benutzerdefinierten Klasse implementiert ... könnten Sie es versuchen? –

+0

Sie sollten 'var timer' nicht in der Funktion' launchTimer' verwenden, sondern nur 'timer', weil Sie Zugriff auf die Eigenschaft haben wollen, oder? –

Antwort

29

EDIT: Beachten Sie, dass Sie nicht in der Lage sein, diesen Fehler in Swift 2.2 beginnen! Sie verwenden die neue #selector-Syntax (siehe https://stackoverflow.com/a/35658335/341994), und der Compiler lässt Sie keinen Selektor für eine Methode bilden, die Objective-C nicht ausgesetzt ist.


Es ist nur eine Frage der Swift-Funktion in Objective-C ausgesetzt wird, so dass es zu Objective-C zu sehen ist. Sie haben vier Möglichkeiten:

  • TimerClass von NSObject Make absteigen (und löschen Sie die init Implementierung):

    class TimerClass : NSObject { 
    
  • Deklarieren TimerClass mit @objc [nicht in Swift 2.0; verwenden, um die vorherige Wahl statt]:

    @objc TimerClass { 
    
  • Deklarieren Sie die Funktion mit @objc:

    @objc func timerEnd() 
    
  • Deklarieren Sie die Funktion dynamic (dies ist wahrscheinlich die schlechteste Wahl, da es nicht notwendig ist - die Funktion ist nicht dynamisch, es muss nicht von Objective-C an Ort und Stelle geändert werden, es muss nur sichtbar sein):

    dynamic func timerEnd(){ 
    
+0

Danke, das ist einfach perfekt! – soling

+1

Es funktioniert, danke. Irgendeine logische Erklärung? – Rivera

+2

@Rivera Es ist nur eine Frage, Objective-C zu erlauben, die Swift-Funktion zu sehen. Sie müssen es Objective-C bewusst in irgendeiner Weise aussetzen. Ich habe meine Antwort geändert, um einige weitere Ansätze zu bieten. – matt