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éprivateel error, desapareció. Lo mismo valefileprivate.En Swift 4
, deberá agregar
@objca la declaración de función. Hasta Swift 4, esto se infirió implícitamente.fuente
fileprivate.fileprivate¿se resolverá?privatenifileprivatefuncionaráNecesitas usar el
@objcatributo ondidTapCommentButton(_:)para usarlo#selector.Dice que hizo eso, pero recibió otro error. Supongo que el nuevo error es que
Postno 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
Postuna subclase deNSObject, pero eso no va a importar, porque el argumento dedidTapCommentButton(_:)no será dePosttodos 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 declarardidTapCommentButtonasí:Luego, enfrentará el problema de obtener el
Postbotó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 unaUITableViewCellsubclase personalizada . Así que supongamos que su celda sePostCelldeclara así:Luego, puede subir la jerarquía de vistas desde el botón para encontrar
PostCelly obtener la publicación de él:fuente
@objc can only be used with members of classes, @objc protocols, and concrete extensions of classesIntente 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-Cdebe usar el tiempo de ejecución. Declaraciones que están marcadas comoprivateofileprivateno están expuestas al tiempo de ejecución de Objective-C de forma predeterminada . Por eso tienes dos variantes:privateofileprivatecon@objc[Acerca de]internal,public,openmodificador de acceso [Acerca de]fuente