Nowy Xcode 7.3 przekazujący parametr przez addTarget zwykle działa dla mnie, ale w tym przypadku generuje błąd w tytule. Jakieś pomysły? Wyrzuca inny, gdy próbuję zmienić go na @objc
Dziękuję Ci!
cell.commentButton.addTarget(self, action: #selector(FeedViewController.didTapCommentButton(_:)), forControlEvents: UIControlEvents.TouchUpInside)
Selektor, do którego dzwoni
func didTapCommentButton(post: Post) {
}
@objc
, czy jest to podklasaNSObject
?Odpowiedzi:
W moim przypadku funkcja selektora była
private
. Po usunięciuprivate
błąd zniknął. To samo dotyczyfileprivate
.W Swift 4
będziesz musiał dodać
@objc
do deklaracji funkcji. Aż do szybkiego 4 było to dorozumiane.źródło
fileprivate
.fileprivate
czy problem zostanie rozwiązany?private
ani niefileprivate
będzie działaćMusisz użyć
@objc
atrybutu on,didTapCommentButton(_:)
aby użyć go z#selector
.Mówisz, że to zrobiłeś, ale pojawił się kolejny błąd. Domyślam się, że nowy błąd
Post
nie jest typem zgodnym z Objective-C. Metodę można uwidocznić w celu-C tylko wtedy, gdy wszystkie jej typy argumentów i typ zwracany są zgodne z celem-C.Możesz to naprawić, tworząc
Post
podklasęNSObject
, ale to nie będzie miało znaczenia, ponieważ argument dodidTapCommentButton(_:)
iPost
tak nie będzie . Argumentem funkcji akcji jest nadawca akcji, a tym nadawcą będziecommentButton
, prawdopodobnieUIButton
. Powinieneś zadeklarować wdidTapCommentButton
ten sposób:Będziesz wtedy musiał stawić czoła problemowi uzyskania
Post
odpowiedniego przycisku. Jest na to wiele sposobów. Tu jest jeden.Rozumiem (ponieważ twój kod mówi
cell.commentButton
), że konfigurujesz widok tabeli (lub widok kolekcji). A ponieważ twoja komórka ma niestandardową właściwość o nazwiecommentButton
, zakładam, że jest to niestandardowaUITableViewCell
podklasa. Załóżmy więc, że twoja komórka jestPostCell
zadeklarowana w ten sposób:Następnie możesz przejść w górę hierarchii widoków od przycisku, aby znaleźć
PostCell
i pobrać z niego wpis:źródło
@objc can only be used with members of classes, @objc protocols, and concrete extensions of classes
Spróbuj ustawić selektor na funkcję opakowującą, która z kolei wywołuje funkcję delegata. To zadziałało dla mnie.
-
źródło
Jak wiecie,
selector
[About] mówi, żeObjective-C
powinno być używane środowisko wykonawcze. Deklaracje, które są domyślnie oznaczone jakoprivate
lubfileprivate
nie są widoczne w środowisku uruchomieniowym Objective-C . Dlatego masz dwa warianty:private
lubfileprivate
deklarację przez@objc
[Informacje]internal
,public
,open
modyfikator dostęp [O]źródło