2016-08-08 15 views
36

Próbuję dodać UITapGesture do UIButton, aby wywoływał funkcję po dotknięciu. Używam Swift 3 i jest coraz jakiś błąd:Swift3 iOS - Jak wywołać funkcję wyzwalacza UITapGestureRecognizer

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

To jest mniej więcej to, co mam:

// 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

jeśli chcesz wywołać funkcję używając UIButton następnie można również użyć qsBlurButton.addTarget (target: self, Działanie: „: funcname”, forControlEvents: TouchUpInside) –

Odpowiedz

96

z kodu używasz Swift 3.0 więc zmienić składnię jak ten

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

oraz Twoja funkcja podobna do tej

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

Edit:

Nie myśl, że jesteś za pomocą przycisku z gestem kranu, zamiast tego używania wbudowanej metody addTarget dla przycisku nie trzeba tworzyć gest kranu za tym tak

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

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

Ok, próbowałem tego, ale ja wciąż uzyskiwanie ten sam błąd.Otrzymuje również ostrzeżenie "Żadna metoda nie została zadeklarowana przy użyciu selektora Objective-C" tapBlurButton: '" – Sebbe

+2

@Sebbe musisz umieścić atrybut @objc na swojej metodzie selektora. '@objc func tapBlurButton() ....' –

+2

Spróbuj zmienić swoją deklarację funkcji za pomocą mojej. –

8

Swift 3

W przypadku, gdy func dla selektora wygląda tak (uwaga: nie ma _):

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

Następnie wybierak wygląda następująco:

#selector(self.tapBlurButton(sender:)) 

Więc kod końcowy dla selektora to:

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

Jeśli nie określono, że pierwszy parametr ma _, potem musisz użyć pełnej nazwy pierwszego parametru.

4

Aby dodać rozpoznawania gestów trzeba utworzyć wskazującą, które funkcjonować będzie zadzwonić:

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

następnie dodać go do elementu trzeba. (Używasz przycisk, a jak inni wyjaśnił przyciski mają swoje rodzime metody „addTarget”)

Dla celów wyjaśnienia wyobrazić chcesz dodać go do UIView:

self.someView.addGestureRecognizer(tapGestureRecognizer) 

I nie zapomnij że niektóre elementy są „nie użytkownik interaktywny” domyślnie, więc może trzeba zmienić tę właściwość też:

self.someView.isUserInteractionEnabled = true 

W Swift 4 funkcja potrzebuje @objc deklarację:

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

W Swift 4 funkcja potrzebuje deklaracji @objc. Czemu? – khunshan

+0

Ponieważ w Swift 3 został automatycznie "wywnioskowany". Jednak w Swift 4 już nie. Funkcja @objc służy do ujawniania metod w środowisku wykonawczym Objective-C. Ta funkcja jest wywoływana za pomocą "selektora", który jest funkcją Objective-C, więc musisz ją ujawnić za pomocą tego słowa kluczowego. – Pochi

Powiązane problemy