5

Ho un PFQueryTableViewController in cui sto cercando di imparare alcune interazioni tableView.Rilevamento di doppio e singolo tocco su UITableViewCell per eseguire due azioni

Quello che hanno attualmente: La cellula tableView aumenta la sua altezza su un rubinetto didSelectRowAtIndexPath o io può sostanzialmente Segue dati relativi alla cella successiva viewController utilizzando performSegueWithIdentifier insieme prepareForSegue utilizzando un unico rubinetto.

Nel seguente codice, se commento il codice "Tocca codice per aumentare l'altezza del codice della tabellaView", posso rilevare il doppio tocco. Altrimenti, il singolo tocco aumenta l'altezza mentre il codice si trova all'interno del blocco SelectSelect.

Cosa mi serve: In Un tocco, l'altezza della cella aumenta o diminuisce. Mentre l'altezza della cella viene aumentata, se tocco due volte, dovrebbe seguire i dati della cella al prossimo UIViewController.

In caso contrario, il singolo rubinetto dovrebbe aumentare o diminuire l'altezza. E doppio tap dovrebbe Segue dati della cella per il prossimo UIViewController

codice è il seguente:

var selectedCellIndexPath: NSIndexPath? 
var SelectedCellHeight = CGFloat() // currently set to 480.0 tableView height 
var UnselectedCellHeight = CGFloat() // currently set to 300.0 tableView unselected hight 
    .... 

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    if let selectedCellIndexPath = selectedCellIndexPath { 
     if selectedCellIndexPath == indexPath { 
      return SelectedCellHeight 
     } 
    } 
    return UnselectedCellHeight 
} 

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    var cell = tableView.dequeueReusableCellWithIdentifier("cell") as! DataViewTableViewCell! 
    if cell == nil { 
     cell = DataViewTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cell") 
    } 

// Below is the double Tap gesture recognizer code in which 
// The single tap is working, double tap is quite difficult to get 
// as the cell height increases on single tap of the cell 

    let doubleTap = UITapGestureRecognizer() 
     doubleTap.numberOfTapsRequired = 2 
     doubleTap.numberOfTouchesRequired = 1 
     tableView.addGestureRecognizer(doubleTap) 

     let singleTap = UITapGestureRecognizer() 
     singleTap.numberOfTapsRequired = 1 
     singleTap.numberOfTouchesRequired = 1 
     singleTap.requireGestureRecognizerToFail(doubleTap) 
     tableView.addGestureRecognizer(singleTap) 

// Tap code to increases height of tableView cell 

    if let selectedCellIndexPath = selectedCellIndexPath { 
     if selectedCellIndexPath == indexPath { 
      self.selectedCellIndexPath = nil 
      cell.postComment.fadeIn() 
      cell.postCreatorPicture.alpha = 1 
      cell.postDate.fadeIn() 
      // cell.postTime.fadeIn() 
      cell.postCreator.fadeIn() 
     } else { 
      self.selectedCellIndexPath = indexPath 
     } 
    } else { 
     selectedCellIndexPath = indexPath 
    } 
    tableView.beginUpdates() 
    tableView.endUpdates() 
} 



func doubleTap() { 
     print("Double Tap") 
    } 

func singleTap() { 
     print("Single Tap") 
    } 

L'altro modo in cui posso farlo funzionare è, se posso ottenere NSIndexPath della cella selezionata al di fuori di didSelectRowAtIndexPath codice, ho può basicamente usare il doppio tocco per eseguire se altro per ottenere l'azione richiesta. Riesci a prendere NSIndexPath al di fuori dei blocchi predefiniti di tableView?

+0

è possibile passare l'oggetto cella con delegato e trovare il percorso di indice con: NSIndexPath * indexPath = [self.tableView indexPathForCell: cell]; – Mohamad

risposta

3

Funzionante!

Primo: definire var customNSIndexPath = NSIndexPath() e aggiungere il codice riportato di seguito all'interno del blocco di codice didSelectRowAtIndexPath.

customNSIndexPath = indexPath 
     print(customNSIndexPath) 

Secondo: Rimuovi "Codice Toccare per aumentare l'altezza di tableView cella" codice didSelectRowAtIndexPath e aggiungere alla funzione singleTap(). Ed esegui i passaggi successivi usando lo doubleTap().

func doubleTap() { 
     print("Double Tap") 
     performSegueWithIdentifier("MainToPost", sender: self) 
    } 

    func singleTap() { 
     print("Single Tap") 
     var cell = tableView.dequeueReusableCellWithIdentifier("cell") as! DataViewTableViewCell! 
     if cell == nil { 
      cell = DataViewTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cell") 
     } 

     if let selectedCellIndexPath = selectedCellIndexPath { 
      if selectedCellIndexPath == customNSIndexPath { 
       self.selectedCellIndexPath = nil 

      } else { 
       self.selectedCellIndexPath = customNSIndexPath 
      } 
     } else { 
      selectedCellIndexPath = customNSIndexPath 
     } 
     tableView.beginUpdates() 
     tableView.endUpdates() 
    } 

Ecco come si fa a lavorare fino a tardi senza dormire. Era la cosa più facile da fare. Grazie

Nota: se qualcuno ha una soluzione migliore o questa è sbagliata in qualche caso xyz, si prega di commentare. Se il tuo è meglio, aiuterebbe davvero gli altri.