with ios swift uikit selector

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 }