2016-08-08 41 views
36

Ich versuche, ein UITapGesture zu einem UIButton hinzufügen, so dass es eine Funktion auslöst, wenn angezapft wird. Ich verwende Swift 3 und einige Fehler bekommen:Swift3 iOS - So machen Sie UITapGestureRecognizer Trigger-Funktion

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[SwiftRunner.ViewController tapBlurButton]: unrecognized selector sent to instance 0x149e07610'

Das ist ungefähr das, was ich habe:

// Swift 3 
import UIKit 
class ViewController { 

    @IBOutlet weak var qsBlurButton: UIButton!  

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let tapGesture = UITapGestureRecognizer(target: self, action: Selector(("tapBlurButton"))) 
     qsBlurButton.addGestureRecognizer(tapGesture) 
    } 

    func tapBlurButton(sender: UITapGestureRecognizer) { 
     print("Please Help!") 
    } 
} 
+0

, wenn Sie eine Funktion UIButton auslösen wollen, dann können Sie auch qsBlurButton.addTarget verwenden (Ziel: Selbst, Aktion: „: FuncName“, forControlEvents: TouchUpInside) –

Antwort

96

Von Ihrem Code Sie swift 3.0 verwenden, um Ihre selector Syntax ändern wie diese

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.tapBlurButton(_:))) 

und Ihre Funktion wie diese

func tapBlurButton(_ sender: UITapGestureRecognizer) { 
    print("Please Help!") 
} 

Edit:

Nicht Idee, dass Sie Schaltfläche mit Tippgeste verwenden, statt diese Verwendung eingebaute Methode addTarget für Taste keine Notwendigkeit für sie tippen Geste wie diese

qsBlurButton.addTarget(self, action: #selector(self.tapBlurButton(_:)), forControlEvents: .TouchUpInside) 

func tapBlurButton(_ sender: UIButton) { 
    print("Please Help!") 
} 
+0

Ok, habe ich versucht, aber ich bin immer noch der immer gleicher FehlerAuch die Warnung erhalten "Keine Methode mit Ziel-C-Selektor 'tapBlurButton deklariert:'" – Sebbe

+2

@Sebbe müssen Sie das @ Objc-Attribut auf Ihre Selektor-Methode setzen. '@objc func tapBlurButton() ....' –

+2

Versuchen Sie, Ihre Funktionsdeklaration mit meiner zu ändern. –

8

Swift zu erstellen 3

In dem Fall, in dem die func für den Selektor wie folgt aussieht (Hinweis: es hat kein _):

func tapBlurButton(sender: UITapGestureRecognizer) { 
    print("Please Help!") 
} 

Dann sieht der Wähler wie folgt aus:

#selector(self.tapBlurButton(sender:)) 

So ist der endgültige Code für den Wähler ist dies:

let tapGesture = UITapGestureRecognizer(target: self, action: #selector(self.tapBlurButton(sender:))) 

Wenn Sie nicht angeben, dass der erste Parameter _ hat, dann Sie müssen den vollständigen Namen des ersten Parameters verwenden.

es
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.handleTapFrom(recognizer:))) 

Dann fügen Sie das Element, das Sie benötigen:

4

Um ein Gestenerkenner Sie eine Anzeige, die sie rufen Funktion zu erstellen, haben hinzuzufügen. (Sie verwenden eine Taste, und wie andere haben erklärt Tasten haben ihre Mutter ‚addTarget‘ Methoden)

Für Erklärungszwecke vorstellen, dass Sie es zu einem UIView hinzufügen möchten:

self.someView.addGestureRecognizer(tapGestureRecognizer) 

Und nicht vergessen dass einige Elemente „nicht vom Benutzer interaktiv“ vorbelegt sind, so dass Sie auch haben könnten, um diese Eigenschaft zu ändern: die @objc Erklärung muss

self.someView.isUserInteractionEnabled = true 

In Swift 4 die Funktion:

@objc func handleTapFrom(recognizer : UITapGestureRecognizer) 
{ 
    // Some code... 
} 
+0

In Swift 4 die Funktion benötigt die @objc-Deklaration. Warum? – khunshan

+0

Weil in Swift 3 automatisch "abgeleitet" wurde. Aber in Swift 4 ist es nicht mehr. Der @objc wird verwendet, um Methoden der Objective-C-Laufzeit zur Verfügung zu stellen. Diese Funktion wird durch einen "Selektor" aufgerufen, bei dem es sich um ein Objective-C-Feature handelt. Sie müssen es daher mit diesem Schlüsselwort angeben. – Pochi