2017-05-14 3 views
1

Ich benutze eine benutzerdefinierte Zelle mit UICollectionView, ich muss UIButton programmgesteuert pro Zelle definieren.UIButton nicht erkannt Selektor an Instanz gesendet

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! ClinicListCell 
    cell.title.text = clinicNames[indexPath.row] 
    cell.subTitle.text = clinicSubs[indexPath.row] 
    cell.backgroundImageView.image = UIImage(named: clinicImages[indexPath.row]) 
    cell.profileBtn.tag = indexPath.row 
    cell.profileBtn.addTarget(self, action: Selector(("profileBtnClicked:")), for: .touchUpInside) 
    return cell 
} 

Und ich habe die folgende Selektor-Methode in der gleichen Klasse definiert.

class func profileBtnClicked(sender:UIButton) { 
    print("Selected") 
} 

Ich habe durch Entfernen Klasse/statisch von der Auswahlmethode versucht, aber es mir immer unrecognized selector sent to instance Fehler geben, wohin gehe ich falsch?

Danke.

+0

Sie sollten die vollständige/komplette Fehlermeldung posten (einschließlich den Info * die * Selektor nicht erkannt wird) –

+0

Siehe auch http://stackoverflow.com/fragen/24007650/selector-in-swift. –

Antwort

0
Try this 
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! ClinicListCell 
    cell.title.text = clinicNames[indexPath.row] 
    cell.subTitle.text = clinicSubs[indexPath.row] 
    cell.backgroundImageView.image = UIImage(named: clinicImages[indexPath.row]) 
    cell.profileBtn.tag = indexPath.row 
    cell.profileBtn.addTarget(self, action: #selector(YourViewController.profileBtnClicked(sender:)), for: UIControlEvents.touchUpInside) 
    return cell 
} 


class func profileBtnClicked(sender:UIButton) { 
    print("Selected") 
} 
versuchen
+0

Danke, das funktioniert. –

+1

Sorry, aber der 'class func'-Qualifier ist falsch. Sie benötigen eine * instance * -Methode, sonst können Sie nicht auf die Eigenschaften und Methoden Ihres View-Controllers zugreifen. –

+0

Eine Antwort ist hilfreicher (für den Autor der Frage und für zukünftige Leser dieses Themas), wenn Sie das Problem * erklären *, anstatt nur Code zu veröffentlichen. Was ist falsch in OP Code und wie ist es behoben? –

1

Versuchen Sie, Ihrer Methode eine @objc hinzuzufügen, die in diesem Fall nicht unbedingt erforderlich ist, und entfernen Sie den Qualifizierer class oder static.

Übrigens, seit Swift 2.2 können Sie eine Selector von einer Swift-Funktion mit dem Operator #selector erstellen. Zum Beispiel:

let clicked = #selector(self.profileBtnClicked(sender:)) 

für:

@objc func profileBtnClicked(sender: UIButton) { 
    ... 
} 

Technisch für NSObject basierte Klassen, sollten die @obj Qualifier nur für private Methoden erforderlich.

+0

Versuchte beide, funktioniert nicht. –

+0

@IbrahimAzharArmar Haben Sie die Kombination aus "@ objc" und "# selector" probiert? Ich aktualisierte meine Antwort ... –

1

Ist das ProfilBtn wahrscheinlich verbunden? Dieser Fehler kann auftreten, wenn sich der Name geändert hat oder die Verknüpfung zwischen der Schaltfläche in Interface Builder und der Variablen entfernt wurde.

Oder Sie können mit der Syntax

cell.profileBtn.addTarget(self, action: #selector("profileBtnClicked:"), for: .touchUpInside) 
+0

Wenn es nicht verbunden war, sollte es mich nicht unerkannten Selektorfehler rechts werfen? Von dem Fehler, den ich verstehe, kann die Selektormethode nicht gefunden werden. –

Verwandte Themen