web-dev-qa-db-fra.com

Utilisation de paramètres en action de UITapGestureRecognizer dans Swift

J'essaie d'appeler une fonction avec des paramètres en utilisant l'action de UITapGestureRecognizer et je ne peux trouver aucune alternative.

Voici le geste supposé appeler la fonction doubleTap avec le paramètre indexPath.

var gestureDoubleTap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "doubleTap(indexPath)")

Ceci est la fonction supposée être appelée.

func doubleTap(indexPath: NSIndexPath) {
    NSLog("double tap")
    NSLog("%@", indexPath.row)
}

Comment appeler la fonction doubleTap avec le paramètre indexPath?

Merci pour toutes les suggestions. 

EDIT- c'est tout mon code, il s'agit essentiellement de configurer l'objet 'name' pour que mon second viewController puisse l'obtenir et l'utiliser

import UIKit
class viewController1: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {

    @IBOutlet weak var collectionView: UICollectionView!
    var imageArray:[String] = []
    var name : AnyObject? {
        get {
        return NSUserDefaults.standardUserDefaults().objectForKey("name")
        }
        set {
            NSUserDefaults.standardUserDefaults().setObject(newValue!, forKey: "name")
            NSUserDefaults.standardUserDefaults().synchronize()
        }
    }

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return imageArray.count
    }

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        var cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as myViewCell

        //adding single and double tap gestures for each cell
        /////////////////////////////
        //ISSUE IS SENDING indexPath TO doubleTap FUNC
        var gestureDoubleTap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "doubleTap:")
        gestureDoubleTap.numberOfTapsRequired = 2
        cell.addGestureRecognizer(gestureDoubleTap)

        var gestureSingleTap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "singleTap")
        gestureSingleTap.numberOfTapsRequired = 1
        cell.addGestureRecognizer(gestureSingleTap)

        cell.imgView.image=UIImage(named: imageArray[indexPath.row])        
        return cell
    }

    //func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath){
    //
    //    name = imageArray[indexPath.row]
    //}

    override func viewDidLoad(){
        super.viewDidLoad()
        imageArray=["1.png","2.png","2.png","1.png","1.png","2.png","1.png","2.png","1.png","2.png","1.png","2.png","1.png","2.png","1.png","2.png"]

    }

    func doubleTap(sender: UITapGestureRecognizer) {
        var tapLocation = sender.locationInView(self.collectionView)

        var indexPath:NSIndexPath = self.collectionView.indexPathForItemAtPoint(tapLocation)!

        //var cell = self.collectionView.cellForItemAtIndexPath(indexPath)

        NSLog("double tap")
        NSLog("%@", indexPath)

        //NSLog("%@", cell!)
        //THIS IS THE GOAL----- set 'name' with the appropriate img      corresponding the cell
        //name = imageArray[indexPath]
        //self.performSegueWithIdentifier("segue", sender: nil)
    }

    func singleTap() {
        NSLog("single tap")
    }
}
17
Cherryholme

Étant donné que vous avez NSIndexPath, je suppose que vous souhaitez récupérer la indexPath correspondante à partir du point de contact sur votre UITableView.

UIGestureRecognizer a un paramètre (ou aucun). Quand il en existe un, il passe lui-même - la indexPath est, cependant, not passée à la fonction comme indiqué.

Disons que nous avons ce qui suit:

let aTap = UITapGestureRecognizer(target: self, action: "tapped:")

et la fonction correspondante lorsque vous appuyez sur la vue:

func tapped(sender: UITapGestureRecognizer)
{
    //using sender, we can get the point in respect to the table view
    let tapLocation = sender.locationInView(self.tableView)

    //using the tapLocation, we retrieve the corresponding indexPath
    let indexPath = self.tableView.indexPathForRowAtPoint(tapLocation)

    //finally, we print out the value
    print(indexPath)

    //we could even get the cell from the index, too
    let cell = self.tableView.cellForRowAtIndexPath(indexPath!)

    cell.textLabel?.text = "Hello, Cell!"
 }

Mettre à jour:

Cela sert à montrer comment ajouter un identificateur de geste à la vue, à travers lequel nous récupérons la indexPath de la cell (item) qui a été activée deux fois.

La fonction de rappel est déclenchée, dans laquelle nous pourrions vérifier si la variable cell (item) sur laquelle nous avons misé est celle qui nous intéresse.

override func viewDidLoad()
{
    super.viewDidLoad()

    let doubleTaps = UITapGestureRecognizer(target: self, action: "doubleTapTriggered:")
    doubleTaps.numberOfTapsRequired = 2
    self.view.addGestureRecognizer(doubleTaps)
}

func doubleTapTriggered(sender : UITapGestureRecognizer)
{
    var tapLocation = sender.locationInView(self.collectionView)
    var indexPath : NSIndexPath = self.collectionView.indexPathForItemAtPoint(tapLocation)!

    if let cell = self.collectionView.cellForItemAtIndexPath(indexPath)
    {
        if(cell.tag == 100)
        {
            print("Hello, I am cell with tag 100")
        }
        else if(cell.tag == 99)
        {
            print("Hello, I am cell with tag 99")
            //We could do something, then, with the cell that we are interested in.
            //I.e., cell.contentView.addSubview(....)
        }
    }
}

Another Update:

Comme il semble que vous ajoutiez un identificateur de geste nécessitant une double pression sur toutes les cellules, cela signifie que vous êtes intéressé par toute cellule sur laquelle vous avez tapé deux fois; et ainsi, nous n’aurions besoin d’aucune condition pour vérifier si les cellules qui nous intéressent sont celles qui nous intéressent, car elles le sont toutes.

Et donc:

func doubleTapTriggered(sender : UITapGestureRecognizer)
{
    var tapLocation = sender.locationInView(self.collectionView)
    var indexPath : NSIndexPath = self.collectionView.indexPathForItemAtPoint(tapLocation)!

    name = imageArray[indexPath]
    self.performSegueWithIdentifier("segue", sender: nil)
}
42
Unheilig

Le meilleur moyen de réaliser ce que vous souhaitez est d'obtenir la vue d'ensemble de votre geste, cela vous donnera l'index correct. Essaye ça:

   func doubleTap(sender: UITapGestureRecognizer) {
        let point = sender.view
        let mainCell = point?.superview
        let main = mainCell?.superview
        let cell: myViewCell = main as! myViewCell
        let indexPath = collectionView.indexPathForCell(cell)
    }

Vous pouvez augmenter ou réduire les super vues en fonction de votre niveau hiérarchique.

3
Uriel

Comme décrit dans les documents de développement Apple, le paramètre action doit recevoir 

action::- Un sélecteur qui identifie la méthode mise en œuvre par la cible pour gérer le geste reconnu par le destinataire. Le sélecteur d'action doit être conforme à la signature décrite dans la vue d'ensemble de la classe. NULL n'est pas une valeur valide.

Et les signatures de méthodes d'action valides décrites dans UIGestureRecognizer.h sont les suivantes:

/ (void) handleGesture; // - (void) handleGesture: (UIGestureRecognizer *) gestureRecognizer;

Donc, fondamentalement, vous/- pas pourrez envoyer autre chose que le paramètre sauf le gestureRecognizer.

0
Vikas Dadheech

Tout ce que vous avez à faire est de l'appeler sans utiliser aucun type de paramètre dans votre littéral chaîne.

var gestureDoubleTap = UITapGestureRecognizer(target: self, action: "doubleTap:")

Le : indique à l'ordinateur que vous utilisez une fonction avec un paramètre et qu'elle est créée ailleurs.

J'espère que cela t'aides :)

0
user2277872