O novo Xcode 7.3 passando o parâmetro via addTarget normalmente funciona para mim, mas neste caso está jogando o erro no título. Alguma ideia? Ele lança outro quando tento alterá-lo para @objc
Obrigado!
cell.commentButton.addTarget(self, action: #selector(FeedViewController.didTapCommentButton(_:)), forControlEvents: UIControlEvents.TouchUpInside)
O seletor está chamando
func didTapCommentButton(post: Post) {
}
@objc
ou é uma subclasse deNSObject
?Respostas:
No meu caso, a função do seletor era
private
. Depois de remover o,private
o erro desapareceu. O mesmo vale parafileprivate
.No Swift 4,
você precisará adicionar
@objc
à declaração da função. Até o swift 4, isso era inferido implicitamente.fonte
fileprivate
.fileprivate
será resolvido?private
nemfileprivate
funcionaráVocê precisa usar o
@objc
atributo emdidTapCommentButton(_:)
para usá-lo com#selector
.Você diz que fez isso, mas recebeu outro erro. Meu palpite é que o novo erro é que
Post
não é um tipo compatível com Objective-C. Você só pode expor um método para Objective-C se todos os seus tipos de argumento, e seu tipo de retorno, forem compatíveis com Objective-C.Você poderia consertar isso criando
Post
uma subclasse deNSObject
, mas isso não fará diferença, porque o argumento paradidTapCommentButton(_:)
não será dePost
qualquer maneira. O argumento para uma função de ação é o remetente da ação, e esse remetente serácommentButton
, o que é presumivelmente aUIButton
. Você deve declarardidTapCommentButton
assim:Você então enfrentará o problema de obter o
Post
correspondente ao botão tocado. Existem várias maneiras de obtê-lo. Aqui está um.Percebi (já que seu código diz
cell.commentButton
) que você está configurando uma visualização de tabela (ou uma visualização de coleção). E como sua célula tem uma propriedade não padrão chamadacommentButton
, presumo que seja umaUITableViewCell
subclasse personalizada . Então, vamos supor que sua célula sejaPostCell
declarada assim:Em seguida, você pode subir na hierarquia de visualização a partir do botão para encontrar
PostCell
e obter a postagem a partir dele:fonte
@objc can only be used with members of classes, @objc protocols, and concrete extensions of classes
Tente fazer com que o seletor aponte para uma função wrapper, que por sua vez chama sua função delegada. Isso funcionou para mim.
-
fonte
Como você sabe,
selector
[About] diz que oObjective-C
runtime deve ser usado. Declarações marcadas comoprivate
oufileprivate
não expostas ao tempo de execução Objective-C por padrão . É por isso que você tem duas variantes:private
oufileprivate
como@objc
[Sobre]internal
,public
,open
modificador de acesso [Sobre]fonte