2016-07-13 17 views
12

Mam programowo stworzył UIView i dodał UIPanGestureRecognizer do niego:Swift 3: Nierozpoznany selektor wysyłane do instancji Xcode 8

class ViewController: UIViewController{ 
    var preludeView: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     initViews() 
     createConstrants() 

     let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: Selector(("handleTap:"))) 
     preludeView.addGestureRecognizer(panGestureRecognizer) 
    } 

    func handleTap(recognizer: UIPanGestureRecognizer) { 
     print("WORKING!!!!") 
    } 

    func initViews() { 
     ... 
    } 

    func createConstrants() { 
     ... 
    } 
} 

Ale kiedy jestem dotykając widok Xcode rzuca błąd:

2016-07-13 09:24:29.918 Draft_Hypa_02[661:83024] -[Draft_Hypa_02.ViewController handleTap:]: unrecognized selector sent to instance 0x17d94a10 2016-07-13 09:24:29.921 Draft_Hypa_02[661:83024] * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Draft_Hypa_02.ViewController handleTap:]: unrecognized selector sent to instance 0x17d94a10' * First throw call stack: (0x249cf91b 0x2416ae17 0x249d52b5 0x249d2ee1 0x248fe238 0x294ae9eb 0x290e984f 0x28f7aff1 0x294afd4f 0x28f3ba57 0x28f38017 0x28f78ec9 0x28f7867b 0x28f49125 0x28f476d3 0x24991dff 0x249919ed 0x2498fd5b 0x248df229 0x248df015 0x25ecfac9 0x28fb1189 0x93144 0x24587873) libc++abi.dylib: terminating with uncaught exception of type NSException

Jednakże, jeśli usunę argument w funkcji handleTap i usuń dwukropek w Selector(("handleTap:")), wszystko działa poprawnie!

Spędziłem już jeden dzień, próbując naprawić ten problem i byłbym bardzo wdzięczny za pomoc!

Odpowiedz

28

Jeśli używasz swift 3 Twój selector powinno być jak ten

#selector(self.handleTap(recognizer:)) 
+1

Xcode rzuca "Wartość typu" ViewController "nie ma elementu 'handleTap'" – Raul

+3

@Forze należy również dodać podkreślenie przed pierwszym parametrem metody. 'func handleTap (_ rozpoznający: UIPanGestureRecognizer) {' –

+0

@Nirav dziękuje, działa! Czy wiesz, że w Swift 3 musimy ustawić zewnętrzną nazwę dla funkcji działania? – Raul

6

Należy napisać oświadczenie w inny sposób. stosowanie następujących linii

let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(ViewController.handleTap(_:)))

zamiast

let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: Selector(("handleTap:")))

nowy sposób

let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(YourViewController.handleTap(_:)))

+0

Xcode 8 rzuca "Wartość typu" ViewController "nie ma członka 'handleTap'" – Raul

+0

użyj self zamiast ViewController lub nazwa twojego viewController –

+0

@Forze: handleTap jest nazwą metody, dzwonisz func handleTap (nadawca: UIPanGestureRecognizer) {} –

2
class ViewController: UIViewController { 

    let customView = UIView() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(handleTap(_:))) 
     customView.addGestureRecognizer(panGestureRecognizer) 
    } 

    func handleTap(panGesture: UIPanGestureRecognizer) { 

    } 
} 

Nie zapomnij dodać niestandardowe UIView do VC.

+0

Dodaję UIView w initViews() i umieszczam tę funkcję w viewDidLoad() – Raul