2016-06-26 12 views
47

Dlaczego to nie działa szybko? wywala go przy starcie mówiąc:Selektor w swift3

'- [my_app_name.displayOtherAppsCtrl kranu:]: nierozpoznany selektor wysyłane do instancji 0x17eceb70 '

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Uncomment the following line to preserve selection between presentations 
    // self.clearsSelectionOnViewWillAppear = false 

    // Register cell classes 
    //self.collectionView!.register(ImageCell.self, forCellWithReuseIdentifier: reuseIdentifier) 

    // Do any additional setup after loading the view. 

    let lpgr = UITapGestureRecognizer(target: self, action: Selector("tap:")) 
    lpgr.delegate = self 
    collectionView?.addGestureRecognizer(lpgr) 
} 

func tap(gestureReconizer: UITapGestureRecognizer) { 
if gestureReconizer.state != UIGestureRecognizerState.ended { 
    return 
} 

let p = gestureReconizer.location(in: self.collectionView) 
let indexPath = self.collectionView?.indexPathForItem(at: p) 

if let index = indexPath { 
    //var cell = self.collectionView?.cellForItem(at: index) 
    // do stuff with your cell, for example print the indexPath 
    print(index.row) 
} else { 
    print("Could not find index path") 
} 
} 
+4

Napisałeś' Selektor ("dotknij:") '. Masz ostrzeżenie. Zignorowałeś to. Rozbiłeś się. – matt

Odpowiedz

119

Selector("tap:") należy teraz zapisać jako #selector(tap(gestureReconizer:))

Ponadto należy zadeklarować stuknięcie jako func tap(_ gestureRecognizer: UITapGestureRecognizer) zgodnie z nowym Swift API Guidelines, w którym to przypadku selektor stanie się #selector(tap(_:)).

+4

Musisz napisać to w ten sposób: '#selector (ClassName.MethodName)' W przeciwnym razie możesz mieć błąd dotyczący selektora objc. – RoaflinSabos

+0

@RoaflinSabos Trzeba tylko podać nazwę klasy, jeśli metoda znajduje się poza klasą, w której deklarowany jest selektor. Nie ma to również wpływu na widoczność w Objective-C. – jjatie

19

w Swift 3 to działa tak:

@IBOutlet var myView: UIView! 
override func viewDidLoad() { 
    super.viewDidLoad() 

    let tap = UITapGestureRecognizer(target: self, action:#selector(handleTap)) 

    myView.addGestureRecognizer(tap) 
} 

func handleTap() { 
    print("tapped") 
} 
+2

To jest świetne, ponieważ pokazuje, że musisz zainicjować UITapGestureRecognizer wewnątrz metody ... Miałem poważne problemy, ponieważ byłem (aczkolwiek głupio) deklarując i inicjując dotknięcie na górze pliku. Pojawiły się słabe komunikaty do debugowania i rozwiązanie problemu zajęło sporo czasu: S ... należy zauważyć, że jeśli funkcja jest prywatna, musisz dodać @objc przed "prywatnym func ..." –

0

Swift 3:

class MYPTempController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let btn = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) 
     view.addSubview(btn) 
     btn.addTarget(self, action: #selector(MYPTempController.btnClick), for: .touchUpInside) 
    } 
    @objc fileprivate func btnClick() { 
     print("--click--") 
    } 
} 

//带参数 
btn.addTarget(self, action: #selector(MYPTempController.btnClick(_:)), for: .touchUpInside) 
//监听方法 
func btnClick(_ sender: UIButton) { 
    print("--click--") 
} 
2

Swift 3 przyszedł z nową składnią więc zamiast używać Selector ("tap: "), #selector (dotknij (gestReconizer :)) to

+1

jest ...? Wygląda na to, że brakuje części zdania. – msanford