2016-06-26 35 views
47

Perché questo non funziona in swift 3? Si blocca in fase di esecuzione dicendo:Selettore in swift3

'- [tap my_app_name.displayOtherAppsCtrl:]: selettore non riconosciuto inviato per esempio 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

Hai scritto' Selettore ("tocca:") '. Hai un avvertimento. L'hai ignorato. Ti sei schiantato. – matt

risposta

119

Selector("tap:") dovrebbero ora essere scritto come #selector(tap(gestureReconizer:))

Inoltre, è necessario dichiarare tap come func tap(_ gestureRecognizer: UITapGestureRecognizer) come per il nuovo Swift API Guidelines nel qual caso il proprio selettore diventerebbe quindi #selector(tap(_:)).

+4

Devi scrivere in questo modo: '#selector (ClassName.MethodName)' Altrimenti puoi avere un errore sul selettore objc. – RoaflinSabos

+0

@RoaflinSabos È necessario includere un nome classe solo se il metodo è esterno alla classe in cui è stato dichiarato il selettore. Ciò non influisce anche sulla visibilità Objective-C. – jjatie

19

In Swift 3 funziona in questo modo:

@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

Questo è ottimo in quanto mostra che devi avviare UITapGestureRecognizer all'interno di un metodo ... Avevo problemi importanti perché stavo (anche se stupidamente) dichiarando e iniziando il rubinetto nella parte superiore del file. Seguirono deboli messaggi di debug e ci volle un po 'per risolvere: S ... da notare, se rendi la funzione privata, apparentemente devi aggiungere @objc prima della "funzione privata ..." –

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 è venuto con nuova sintassi così invece di utilizzare Selector ("tap: "), #selector (tocca (gestureReconizer :)) è

+1

è ...? Sembra che manchi una parte della frase. – msanford