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.

7voto

John Lee Punkte 104
// für swift 2.2
// version 1
buttton.addTarget(self, action: #selector(ViewController.tappedButton), forControlEvents: .TouchUpInside)
buttton.addTarget(self, action: #selector(ViewController.tappedButton2(_:)), forControlEvents: .TouchUpInside)

// version 2
buttton.addTarget(self, action: #selector(self.tappedButton), forControlEvents: .TouchUpInside)
buttton.addTarget(self, action: #selector(self.tappedButton2(_:)), forControlEvents: .TouchUpInside)

// version 3
buttton.addTarget(self, action: #selector(tappedButton), forControlEvents: .TouchUpInside)
buttton.addTarget(self, action: #selector(tappedButton2(_:)), forControlEvents: .TouchUpInside)

func tappedButton() {
  print("tapped")
}

func tappedButton2(sender: UIButton) {
  print("tapped 2")
}

// swift 3.x
button.addTarget(self, action: #selector(tappedButton(_:)), for: .touchUpInside)

func tappedButton(_ sender: UIButton) {
  // tapped
}

button.addTarget(self, action: #selector(tappedButton(_:_:)), for: .touchUpInside)

func tappedButton(_ sender: UIButton, _ event: UIEvent) {
  // tapped
}

6voto

yoAlex5 Punkte 20661

Objective-C Selektor

Ein Selektor identifiziert eine Methode.

//Zur Kompilierzeit
SEL selektor = @selector(foo);

//Zur Laufzeit
SEL selektor = NSSelectorFromString(@"foo");

Zum Beispiel

[object sayHello:@"Hallo Welt"];
//sayHello: ist ein Selektor

selektor ist ein Wort aus der Objective-C Welt und du kannst es auch von Swift aus verwenden, um die Möglichkeit zu haben, Objective-C von Swift aus aufzurufen. Es ermöglicht dir, Code zur Laufzeit auszuführen.

Vor Swift 2.2 lautet die Syntax:

Selector("foo:")

Da ein Funktionsname als String-Parameter ("foo") an Selector übergeben wird, ist es nicht möglich, den Namen zur Compile-Zeit zu überprüfen. Als Ergebnis könnte es zu einem Laufzeitfehler kommen:

unrecognized selector sent to instance

Nach Swift 2.2+ lautet die Syntax:

#selector(foo(_:))

Das Autocomplete von Xcode hilft dir dabei, die richtige Methode aufzurufen

5voto

Renish Dadhaniya Punkte 10462
Erstellen Sie ein Refresh-Control mit der Selector-Methode.
var refreshCntrl : UIRefreshControl!
refreshCntrl = UIRefreshControl()
refreshCntrl.tintColor = UIColor.whiteColor()
refreshCntrl.attributedTitle = NSAttributedString(string: "Bitte warten...")
refreshCntrl.addTarget(self, action:"refreshControlValueChanged", forControlEvents: UIControlEvents.ValueChanged)
atableView.addSubview(refreshCntrl)

//Refresh-Control Methode

func refreshControlValueChanged(){
    atableView.reloadData()
    refreshCntrl.endRefreshing()
}

5voto

LukeSideWalker Punkte 6433

Da Swift 3.0 veröffentlicht wurde, ist es noch etwas subtiler, ein geeignetes targetAction zu deklarieren

class MyCustomView : UIView {

    func addTapGestureRecognizer() {

        // das "_" ist wichtig
        let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(MyCustomView.handleTapGesture(_:)))
        tapGestureRecognizer.numberOfTapsRequired = 1
        addGestureRecognizer(tapGestureRecognizer)
    }

    // seit Swift 3.0 ist dieses "_" in der Methodenimplementierung sehr wichtig, um dem Selektor das targetAction zu verstehen
    func handleTapGesture(_ tapGesture: UITapGestureRecognizer) {

        if tapGesture.state == .ended {
            print("Tap-Geste erkannt")
        }
    }
}

4voto

Michael Peterson Punkte 9656

Es kann nützlich sein zu beachten, wo Sie die Steuerung einrichten, die die Aktion auslöst.

Zum Beispiel habe ich festgestellt, dass ich beim Einrichten eines UIBarButtonItem den Button innerhalb von viewDidLoad erstellen musste, sonst würde ich eine nicht erkannte Selektor-Ausnahme erhalten.

override func viewDidLoad() {
    super.viewDidLoad() 

    // Schaltfläche hinzufügen
    let addButton = UIBarButtonItem(image: UIImage(named: "746-plus-circle.png"), style: UIBarButtonItemStyle.Plain, target: self, action: Selector("addAction:"))
    self.navigationItem.rightBarButtonItem = addButton
}

func addAction(send: AnyObject?) {     
   NSLog("addAction")
}

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