ios - framework - El argumento de ''#selector'' no se refiere a un método, propiedad o inicializador ''@objc''
use swift class in objective c (6)
Subcelicé en Swift 3 una subclase UIButton
que está escrita en Objective-C.
Cuando intento agregar un objetivo, falla con un código de error:
class ActionButton: JTImageButton {
func action() {
}
func configure()) {
// ...
self.addTarget(self, action: #selector(self.action()), for: .touchUpInside)
// error:
// Argument of ''#selector'' does not refer to an ''@objc'' method, property, or initializer
}
}
Añadiendo la palabra clave @objc
en la parte frontal del método que es perfecto, pero todavía tengo este error. Finalmente, encontré la solución como sigue
Hay un par de paréntesis superfluos detrás del método como se muestra en la imagen de arriba. Lo que debo hacer es que lo saquen y funcionó bien.
Agregado de los comentarios en otra respuesta: func action () no es solo una mala elección para el nombre y la acción de una función, sino que falla en la compilación. (Sin embargo, puede usarlo como un parámetro de función de entrada, lo que hago para mayor claridad al pasar el objetivo / acción a un init () que establece estas cosas). Estoy reemplazando esto con MyAction () para mayor claridad.
Prueba esto:
self.addTarget(self, action: #selector(MyAction), for: .touchUpInside)
Dicho esto, un diseño mucho mejor es mover la función MyAction () a la supervisión de botón, ya que eso hace que las cosas estén más alineadas con el diseño básico de MVC:
Superview:
let myButton = ActionButton()
// include other button setup here
myButton.addTarget(self, action: #selector(MyAction), for: .touchUpInside
func action(_ sender: ActionButton) {
// code against button tap here
}
Codificación alternativa para esto, manteniendo el método "action ()" en el controlador de vista pero moviendo solo el "addTarget" al botón:
self.addTarget(superview?, action(superview?.MyAction), for: .touchUpInside)
¿Por qué le estoy pidiendo que considere mover el método "Mi Acción ()" a la vista de supervisión? Doble:
- No solo controla el botón, sino también todas las demás subvistas en su vista y, por lo general, interactúan entre sí a través del controlador de vista.
- Hace que el botón sea mucho más reutilizable en otros escenarios.
El problema es que en #selector(self.action())
, self.action()
es una llamada al método . No quieres llamar al método; quieres nombrar el método Diga #selector(action)
lugar: pierda los paréntesis, y además no hay necesidad de self
.
En lugar de decir self.action()
, usa ActionButton.action()
.
Si no le importa agregar una función adicional, puede anidar la función.
self.addTarget(self, action: myAction, for: UIControlledEvent)
myAction(){
@obj.methodYouWantToCall(//parameters//)
}
Todo lo que tienes que hacer es marcar la función como @objc
y no hay necesidad de la self
referencia ni el paréntesis
class ActionButton: JTImageButton {
@objc func btnAction() {
}
func configure() {
// ...
self.addTarget(self, action: #selector(btnAction), for: .touchUpInside)
// error:
// Argument of ''#selector'' does not refer to an ''@objc'' method, property, or initializer
}
}
Incluso puedes hacerlo private
si quieres.