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")
}
}
É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)
}
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.
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.
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 :)