Pasar argumentos a selector en Swift
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 algunos pin imágenes que indican la ubicación de los puntos de interés. Cuando el usuario toca uno de estos pines me gustaría saber qué punto de interés tocó, y tengo un objeto modelo que describe estos puntos de interés. Uso 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 manejador de gestos.
2 answers
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)
, Donde (...)
El parámetro
sender
es el objeto de control que envía el mensaje de acción.
En su caso, el remitente es el UITapGestureRecognizer
También, #selector()
debe contener la firma func, y NO incluye parámetros pasados. Así que para...
func handleTap(sender: UIGestureRecognizer) {
}
Usted debería tener {
let gesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(sender:)))
Asumiendo que el func y el gesto están dentro de un controlador de vista, del cual modelObj
es una propiedad / ivar, no hay necesidad de pasarlo con el reconocedor de gestos, solo puede referirse a él en handleTap
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-19 10:03:00
Paso 1: cree el objeto personalizado del remitente.
Paso 2: agregue las propiedades que desea cambiar en ese objeto personalizado del remitente
Paso 3: encasillar el remitente en la función de recepción a un objeto personalizado y acceder a esas propiedades
Para eg: 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 como sigue
@IBOutlet weak var btnFullRemote: CustomButton!
Paso 2-b: establezca la clase personalizada en el guion gráfico también
Paso 3: agregue las propiedades que desea cambiar en ese objeto personalizado del remitente
btnFullRemote.name = "Nik"
btnFullRemote.customObject = customObject
btnFullRemote.customObject2 = customObject2
btnFullRemote.addTarget(self, action: #selector(self.btnFullRemote(_:)), for: .touchUpInside)
Paso 4: encasillar el remitente en la función de recepción a un objeto personalizado y acceder 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
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-10 18:05:09