2016-06-26 6 views
47

Warum funktioniert das nicht in swift 3? Es befindet sich auf Laufzeit abstürzt sagen:Selektor in swift3

'- [my_app_name.displayOtherAppsCtrl Hahn:]: Unbekannter Selektor zum Beispiel 0x17eceb70 gesendet'

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

Sie schrieb' Selector ("tippen:") '. Du hast eine Warnung erhalten. Du hast es ignoriert. Du bist abgestürzt. – matt

Antwort

119

Selector("tap:") jetzt als #selector(tap(gestureReconizer:))

geschrieben werden soll Außerdem sollten Sie den Tap als func tap(_ gestureRecognizer: UITapGestureRecognizer) gemäß der neuen Swift API Guidelines deklarieren. In diesem Fall würde Ihr Selektor dann #selector(tap(_:)) werden.

+4

Sie müssen es auf diese Weise schreiben: '#selector (ClassName.MethodName)' Sonst können Sie einen Fehler über objc Selektor haben. – RoaflinSabos

+0

@RoaflinSabos Sie müssen nur einen Klassennamen angeben, wenn die Methode außerhalb der Klasse liegt, in der der Selektor deklariert ist. Die Sichtbarkeit von Objective-C wird ebenfalls nicht beeinflusst. – jjatie

19

In Swift 3 funktioniert es wie folgt aus:

@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

Das ist großartig, da es zeigt, dass Sie den UITapGestureRecognizer innerhalb einer Methode initalisieren müssen ... Ich hatte große Probleme, weil ich (wenn auch doof) den Tap am Anfang der Datei deklarierte und initiierte. Schlechte Debugging-Meldungen folgten, und es dauerte eine ganze Weile, um zu lösen: S ... zu beachten, wenn Sie die Funktion privat machen, müssen Sie scheinbar @objc hinzufügen, bevor die "private 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 mit neuen Syntax kam so statt Selector der Verwendung ("tap: "), #selector (tippen (GestenReconizer :)) ist

+1

ist ...? Es sieht so aus, als ob ein Teil des Satzes fehlt. – msanford