ios - with - swift 4 selector syntax
Pasar argumentos al selector en Swift (2)
Parece que estás malinterpretando un par de cosas.
Cuando se usa target/action , la firma de la función debe tener una forma determinada ...
func doSomething(sender: Any)
o
func doSomething(sender: Any, forEvent event: UIEvent)
dónde…
El parámetro del
sender
es el objeto de control que envía el mensaje de acción.
En su caso, el remitente es el
UITapGestureRecognizer
Además,
#selector()
debe contener la firma de func y NO incluye parámetros pasados.
Entonces por ...
func handleTap(sender: UIGestureRecognizer) {
}
Deberías…
let gesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(sender:)))
Suponiendo que el func y el gesto están dentro de un controlador de vista, de los cuales
modelObj
es una propiedad / ivar, no hay necesidad de pasarlo con el reconocedor de gestos, solo puede consultarlo en
handleTap
Estoy agregando programáticamente un UITapGestureRecognizer a una de mis vistas:
let gesture = UITapGestureRecognizer(target: self, action: #selector(self.handleTap(modelObj:myModelObj)))
self.imageView.addGestureRecognizer(gesture)
func handleTap(modelObj: Model) {
// Doing stuff with model object here
}
El primer problema que encontré fue "El argumento de ''#selector'' no se refiere a un método, propiedad o inicializador ''@Objc''.
Genial, así que agregué @objc a la firma handleTap:
@objc func handleTap(modelObj: Model) {
// Doing stuff with model object here
}
Ahora recibo el error "El método no se puede marcar @objc porque el tipo del parámetro no se puede representar en Objective-C.
Es solo una imagen del mapa de un edificio, con algunas imágenes de pin que indican la ubicación de los puntos de interés. Cuando el usuario toca uno de estos pines, me gustaría saber en qué punto de interés tocaron, y tengo un objeto modelo que describe estos puntos de interés. Utilizo este objeto modelo para dar a la imagen del pin sus coordenadas en el mapa, así que pensé que habría sido fácil para mí enviar el objeto al controlador de gestos.
Paso 1: crea el objeto personalizado del remitente.
Paso 2: agrega las propiedades que deseas cambiar en un objeto personalizado del remitente
paso 3: escribe el remitente en la función de recepción a un objeto personalizado y accede a esas propiedades
Por ejemplo: al hacer clic en el botón si desea enviar la cadena o cualquier objeto personalizado, entonces
paso 1: crear
class CustomButton : UIButton {
var name : String = ""
var customObject : Any? = nil
var customObject2 : Any? = nil
convenience init(name: String, object: Any) {
self.init()
self.name = name
self.customObject = object
}
}
Paso 2-a: Cree IBOutlet de ese botón con una clase personalizada de la siguiente manera
@IBOutlet weak var btnFullRemote: CustomButton!
Paso 2-b: configura la clase personalizada en el guión gráfico también
Paso 3: agrega las propiedades que deseas cambiar en un objeto personalizado del remitente
btnFullRemote.name = "Nik"
btnFullRemote.customObject = customObject
btnFullRemote.customObject2 = customObject2
btnFullRemote.addTarget(self, action: #selector(self.btnFullRemote(_:)), for: .touchUpInside)
Paso 4: escriba el remitente en la función de recepción a un objeto personalizado y acceda a esas propiedades
@objc public func btnFullRemote(_ sender: Any) {
var name : String = (sender as! CustomButton).name as? String
var customObject : customObject = (sender as! CustomButton).customObject as? customObject
var customObject2 : customObject2 = (sender as! CustomButton).customObject2 as? customObject2
}