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.

Author: Ashley Mills, 2017-04-06

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

 40
Author: Ashley Mills,
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

introduzca la descripción de la imagen aquí

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

}
 2
Author: Ninad Kambli,
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