2017-04-06 6 views
8

Ich bin ein UITapGestureRecognizer zu einem meiner Ansichten hinzufügen:Passing Argumente programmatisch Wähler in swift3

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 
} 

Das erste Problem, das ich gestoßen war „Argument von‚#selector‘bezieht sich nicht auf eine‚@Objc 'Verfahren, das Eigentum oder initializer

Cool, so fügte ich @objc zum handleTap Signatur.

@objc func handleTap(modelObj: Model) { 
    // Doing stuff with model object here 
} 

nun den Fehler „ich erhalte Methode kann wegen der ty markiert @objc werden pe des Parameters kann in Objective-C nicht dargestellt werden.

Es ist nur ein Bild der Karte eines Gebäudes, mit einigen Pin-Bildern, die die Position von Sonderzielen angeben. Wenn der Benutzer einen dieser Pins antippt, würde ich gerne wissen, welchen Punkt von Interesse Sie angetippt haben, und ich habe ein Modellobjekt, das diese Punkte von Interesse beschreibt. Ich benutze dieses Modell-Objekt, um dem Pin-Bild seine Koordinaten auf der Karte zu geben, also dachte ich, es wäre einfach für mich gewesen, das Objekt einfach an den Gesten-Handler zu senden.

+0

Sie können nicht passieren Werte an einen Wähler so erstellen. Warum können Sie diesen Wert nicht in einer Instanzvariablen speichern und von der Selector-Methode aus darauf zugreifen? –

+4

Mögliches Duplikat von http://stackoverflow.com/questions/35635595/sending-a-parameter-argument-to-function-through-uitapgesture-recognizer-selector. –

Antwort

20

Es sieht aus wie Sie ein paar Dinge Missverständnisse sind.

Wenn target/action verwenden, hat die Funktion Signatur eine bestimmte Form ...

func doSomething(sender: Any) 

oder

func doSomething(sender: Any, forEvent event: UIEvent) 

wo ...

Der sender Parameter das Steuerobjekt das Senden haben ist Aktionsnachricht.

In Ihrem Fall ist der Absender die UITapGestureRecognizer

Auch #selector() die func Signatur enthalten sollte, und beinhaltet nicht übergebenen Parameter.Also für ...

func handleTap(sender: UIGestureRecognizer) { 

} 

sollten Sie ...

let gesture = UITapGestureRecognizer(target: self, action: #selector(handleTap(sender:))) 

die Func und die Geste Unter der Annahme, sind innerhalb eines View-Controller, von denen modelObj eine Eigenschaft/Ivar ist, gibt es keine Notwendigkeit, es zu passieren ist mit der Geste Erkenner, können Sie einfach darauf verweisen in handleTap

1

Ich denke, Sie sollten eine @objc Methode erstellen, die handleTap(modelObj:myModelObj) aufruft.

@objc func someMethod() { // name this properly! 
    handleTap(modelObj: myModelObj) 
} 

Dann können Sie diese als Selektor übergeben:

#selector(someMethod) 
0

Anstatt zu versuchen, handleTap direkt so zu nennen:

#selector(self.handleTap(modelObj:myModelObj)) 

Sie könnten eine Funktion rufen Sie dann eine andere Funktion mit Parametern

#selector(anyName) 

func anyName() { 
    let model = Model() 
    handleTap(modelObj: model) 
} 

func handleTap(modelObj: Model) { 
    // Doing stuff with model object here 
}