698 Stimmen

@selector() in Swift?

Ich versuche, einen NSTimer in Swift zu erstellen, aber ich habe einige Probleme.

NSTimer(timeInterval: 1, target: self, selector: test(), userInfo: nil, repeats: true)

test() ist eine Funktion in derselben Klasse.


Ich bekomme einen Fehler im Editor:

Konnte keine Überladung für 'init' finden, die die bereitgestellten Argumente akzeptiert

Wenn ich selector: test() zu selector: nil ändere, verschwindet der Fehler.

Ich habe versucht:

  • selector: test()
  • selector: test
  • selector: Selector(test())

Aber nichts funktioniert und ich kann keine Lösung in den Referenzen finden.

26voto

Rob Sanders Punkte 4758

Für zukünftige Leser, habe ich festgestellt, dass ich ein Problem hatte und einen unbekannten Selektor an Instanz gesendet Fehler bekam, der verursacht wurde, indem das Ziel func als privat markiert wurde.

Die func MUSS öffentlich sichtbar sein, um von einem Objekt mit einem Verweis auf einen Selektor aufgerufen zu werden.

21voto

Martin Cazares Punkte 13509

Nur für den Fall, dass jemand anderes das gleiche Problem hatte wie ich mit NSTimer, bei dem keines der anderen Antworten das Problem behoben hat, ist es wirklich wichtig zu erwähnen, dass, wenn Sie eine Klasse verwenden, die nicht direkt oder tief in der Hierarchie von NSObject erbt (z.B. manuell erstellte Swift-Dateien), keine der anderen Antworten funktionieren wird, auch wenn sie wie folgt angegeben ist:

let timer = NSTimer(timeInterval: 1, target: self, selector: "test", 
                    userInfo: nil, repeats: false)
func test () {}

Ohne irgendetwas anderes zu ändern, außer die Klasse nur von NSObject erben zu lassen, habe ich aufgehört, den "Unrecognized selector" Fehler zu erhalten und meine Logik funktionierte wie erwartet.

15voto

Scooter Punkte 3967

Wenn Sie einen Parameter an die Funktion aus dem NSTimer übergeben möchten, lautet hier Ihre Lösung:

var somethingToPass = "Es hat funktioniert"

let timer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: "tester:", userInfo: somethingToPass, repeats: false)

func tester(timer: NSTimer)
{
    let theStringToPrint = timer.userInfo as String
    println(theStringToPrint)
}

Fügen Sie den Doppelpunkt in den Selektortext ein (tester:), und Ihre Parameter werden in userInfo platziert.

Ihre Funktion sollte NSTimer als Parameter nehmen. Extrahieren Sie dann einfach userInfo, um den übergebenen Parameter zu erhalten.

12voto

Krunal Punkte 73316

Swift 4.1
Mit Beispiel für Tippgeste.

let gestureRecognizer = UITapGestureRecognizer()
self.view.addGestureRecognizer(gestureRecognizer)
gestureRecognizer.addTarget(self, action: #selector(self.dismiss(completion:)))

// Verwenden Sie direkt das Ziel 'Klassenname', wenn Ihre Selektorfunktion nicht in derselben Klasse ist.
//gestureRecognizer.addTarget(self, action: #selector(DestinationClass.dismiss(completion:)))

@objc func dismiss(completion: (() -> Void)?) {
      self.dismiss(animated: true, completion: completion)
}

Sehen Sie Apples Dokument für weitere Details unter: Selector Expression

12voto

Jony T Punkte 474

Selektoren sind eine interne Darstellung eines Methodennamens in Objective-C. In Objective-C würde "@selector(methodName)" eine Methode im Quellcode in einen Datentyp SEL umwandeln. Da du die @selector-Syntax in Swift nicht verwenden kannst (rickster liegt da richtig), musst du den Methodennamen manuell als String-Objekt direkt angeben oder ein String-Objekt an den Selector-Typ übergeben. Hier ist ein Beispiel:

var rightBarButton = UIBarButtonItem(
    title: "Abmelden", 
    style: UIBarButtonItemStyle.Plain, 
    target: self, 
    action:"abmelden"
)

oder

var rightBarButton = UIBarButtonItem(
    title: "Abmelden", 
    style: UIBarButtonItemStyle.Plain, 
    target: self, 
    action:Selector("abmelden")
)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X