Der neue Xcode 7.3, der den Parameter über addTarget übergibt, funktioniert normalerweise für mich, aber in diesem Fall wird der Fehler im Titel ausgelöst. Irgendwelche Ideen? Es wirft einen anderen, wenn ich versuche, ihn in @objc zu ändern
Danke dir!
cell.commentButton.addTarget(self, action: #selector(FeedViewController.didTapCommentButton(_:)), forControlEvents: UIControlEvents.TouchUpInside)
Der Selektor, den er anruft
func didTapCommentButton(post: Post) {
}
@objc
oder ist es eine Unterklasse vonNSObject
?Antworten:
In meinem Fall war die Funktion des Selektors
private
. Sobald ichprivate
den Fehler entfernt hatte, war er verschwunden. Gleiches gilt fürfileprivate
.In Swift 4 müssen
Sie
@objc
der Funktionsdeklaration hinzufügen . Bis schnell 4 wurde dies implizit abgeleitet.quelle
fileprivate
.fileprivate
wird es gelöst?private
nochfileprivate
noch funktionieren wirdSie müssen das verwenden
@objc
Attribut auf ,didTapCommentButton(_:)
es zu benutzen mit#selector
.Sie sagen, Sie haben das getan, aber Sie haben einen weiteren Fehler erhalten. Ich vermute, dass der neue Fehler darin besteht, dass
Post
es sich nicht um einen Typ handelt, der mit Objective-C kompatibel ist. Sie können eine Methode nur dann für Objective-C verfügbar machen, wenn alle Argumenttypen und der Rückgabetyp mit Objective-C kompatibel sind.Sie könnten das beheben, indem Sie
Post
eine Unterklasse aus erstellenNSObject
, aber das spielt keine Rolle, da das Argument dafür sowiesodidTapCommentButton(_:)
kein seinPost
wird. Das Argument für eine Aktionsfunktion ist der Absender der Aktion, und dieser Absender wird seincommentButton
, was vermutlich a istUIButton
. Sie solltendidTapCommentButton
wie folgt deklarieren :Sie haben dann das Problem, die
Post
entsprechende Schaltfläche zu erhalten. Es gibt mehrere Möglichkeiten, um es zu bekommen. Hier ist eine.Ich erfahre (da Ihr Code sagt
cell.commentButton
), dass Sie eine Tabellenansicht (oder eine Sammlungsansicht) einrichten. Und da Ihre Zelle eine nicht standardmäßige Eigenschaft mit dem Namen hatcommentButton
, gehe ich davon aus, dass es sich um eine benutzerdefinierteUITableViewCell
Unterklasse handelt. Nehmen wir also an, Ihre Zelle istPostCell
wie folgt deklariert:Dann können Sie die Ansichtshierarchie über die Schaltfläche nach oben gehen, um die zu finden
PostCell
, und den Beitrag daraus abrufen:quelle
@objc can only be used with members of classes, @objc protocols, and concrete extensions of classes
Versuchen Sie, den Selektor auf eine Wrapper-Funktion zu verweisen, die wiederum Ihre Delegatenfunktion aufruft. Das hat bei mir funktioniert.
- -
quelle
Wie Sie wissen, sagt
selector
[About] , dass dieObjective-C
Laufzeit verwendet werden sollte. Deklarationen, die standardmäßig als Objective-C-Laufzeit gekennzeichnet sindprivate
oderfileprivate
nicht . Deshalb haben Sie zwei Varianten:private
oderfileprivate
Erklärung mit@objc
[Über]internal
,public
,open
Zugriffsmodifikator [Über]quelle