2015-08-19 2 views
16

Я пытаюсь вызвать функцию с параметрами, используя действие UITapGestureRecognizer, и я не могу найти альтернативы.Использование параметров в действии UITapGestureRecognizer в Swift

Это жесть, которая, как предполагается, вызывает функцию doubleTap с параметром indexPath.

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

Это функция, которая должна быть вызвана.

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

Как я могу назвать doubleTap функция с параметром indexPath?

Благодарим вас за все предложения.

EDIT - это весь мой код, это в основном настройки «имя» объекта таким образом мой второй ViewController может получить и использовать его

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") 
    } 
} 

ответ

38

Учитывая, что у вас есть NSIndexPath, я полагаю, вы хотели бы получить соответствующую indexPath с точкой крана касания на вашем UITableView.

UIGestureRecognizer имеет один (или нет) параметр. Когда есть один, он проходит сам - indexPath, однако, не передается функции, как упомянуто.

Допустим, мы имеем следующее:

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

и соответствующей функции, когда точка зрения постучала:

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!" 
} 

Update:

Это служит, чтобы показать как добавить распознаватель жестов в представление, через которое мы получаем indexPath из cell (item), который был постучал дважды.

Сработала функция обратного вызова, в рамках которой мы можем проверить, является ли то, что нас интересует cell (item).

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(....) 
     } 
    } 
} 

Другого Update:

Поскольку кажется, что вы добавляете жест распознаватель, который требует двойных отводов для всех клеток, который говорит мне, что вы заинтересованы в любой клетке, которая была дважды постучала на; и поэтому нам не понадобится какое-либо условие, чтобы проверить, являются ли ячейки теми, кого мы интересуем, потому что они все.

И так:

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) 
} 
+0

Хорошо, это имеет смысл, за исключением того, что я использую UICollectionView, я угадываю его ту же процедуру, и я могу получить tapLocation и indexPath из UICollectionCell? – Cherryholme

+0

Я не могу получить целое число от indexPath. когда я печатаю indexPath, я получаю «0xc000000000000016> {length = 2, path = 0 - 0}» в моей консоли. как мне просто получить 0 из этого indexPath? indexPath.row не работает, он говорит, что он не является членом indexPath – Cherryholme

+0

Если я добавлю распознаватель жестов в представление, чем любой нажатие или двойное нажатие вызовет жест, мне нужно, чтобы каждая ячейка имела свою функцию при нажатии или double tapped – Cherryholme

0

Все, что вам нужно сделать, это вызов он не использует какие-либо параметры в строковом литерале.

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

The : сообщает компьютеру, что вы используете функцию с параметром, и создается где-то в другом месте.

Надеется, что это помогает :)

+0

хорошо, что имеет для меня некоторый смысл, но тогда как функция doubleTap фактически получает переменную indexPath? – Cherryholme

+0

Он будет вызван через ваше действие. Вызываемая функция обрабатывает всю информацию о параметрах – user2277872

0

Как описано в документах разработчика яблоко, параметр действия должен получить

действия :: - селектор, который идентифицирует метод, реализованный в мишени обрабатывать жест, распознаваемый приемником. Селектор действий должен соответствовать сигнатуре, описанной в обзоре классов. Значение NULL недопустимо.

И Правильные действия сигнатуры методов, описанных в UIGestureRecognizer.h являются:

// - (Недействительными) handleGesture; // - (void) handleGesture: (UIGestureRecognizer *) gestureRecognizer;

Так в основном, вы не быть в состоянии послать что-нибудь еще в качестве параметра, кроме gestureRecognizer.

3

Лучший способ достичь того, что вы хотите, получить контроль над вашим жестом кран, это даст вам правильный indexPath. Попробуйте следующее:

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) 
    } 

Вы можете увеличить или уменьшить количество просмотров в зависимости от уровня иерархии.

+3

Собственно, это никоим образом не «лучший» способ. Особенно с учетом вопроса и существующих ответов. – SmokeDispenser

Смежные вопросы