El nuevo Xcode 7.3 que pasa el parámetro a través de addTarget generalmente funciona para mí, pero en este caso arroja el error en el título. ¿Algunas ideas? Lanza otro cuando intento cambiarlo a @objc
¡Gracias!
cell.commentButton.addTarget(self, action: #selector(FeedViewController.didTapCommentButton(_:)), forControlEvents: UIControlEvents.TouchUpInside)
El selector está llamando
func didTapCommentButton(post: Post) {
}
@objc
, o es una subclase deNSObject
?Respuestas:
En mi caso la función del selector fue
private
. Una vez que eliminéprivate
el error, desapareció. Lo mismo valefileprivate
.En Swift 4
, deberá agregar
@objc
a la declaración de función. Hasta Swift 4, esto se infirió implícitamente.fuente
fileprivate
.fileprivate
¿se resolverá?private
nifileprivate
funcionaráNecesitas usar el
@objc
atributo ondidTapCommentButton(_:)
para usarlo#selector
.Dice que hizo eso, pero recibió otro error. Supongo que el nuevo error es que
Post
no es un tipo compatible con Objective-C. Solo puede exponer un método a Objective-C si todos sus tipos de argumentos y su tipo de retorno son compatibles con Objective-C.Podrías arreglar eso haciendo
Post
una subclase deNSObject
, pero eso no va a importar, porque el argumento dedidTapCommentButton(_:)
no será dePost
todos modos. El argumento de una función de acción es el remitente de la acción, y ese remitente serácommentButton
, que presumiblemente es unUIButton
. Deberías declarardidTapCommentButton
así:Luego, enfrentará el problema de obtener el
Post
botón correspondiente al tocado. Hay varias formas de conseguirlo. Aquí hay uno.Entiendo (ya que su código dice
cell.commentButton
) que está configurando una vista de tabla (o una vista de colección). Y dado que su celda tiene una propiedad no estándar nombradacommentButton
, supongo que es unaUITableViewCell
subclase personalizada . Así que supongamos que su celda sePostCell
declara así:Luego, puede subir la jerarquía de vistas desde el botón para encontrar
PostCell
y obtener la publicación de él:fuente
@objc can only be used with members of classes, @objc protocols, and concrete extensions of classes
Intente hacer que el selector apunte a una función contenedora, que a su vez llama a su función delegada. Eso funcionó para mí.
-
fuente
Como sabes,
selector
[About] dice que seObjective-C
debe usar el tiempo de ejecución. Declaraciones que están marcadas comoprivate
ofileprivate
no están expuestas al tiempo de ejecución de Objective-C de forma predeterminada . Por eso tienes dos variantes:private
ofileprivate
con@objc
[Acerca de]internal
,public
,open
modificador de acceso [Acerca de]fuente