2017-09-19 1 views
0

Je développe une application iOS en utilisant Swift et j'ai un contrôleur de vue qui se sépare d'une vue de contenu de cellule en sélectionnant une rangée de cellules ou en sélectionnant un bouton dans la vue de contenu de cette rangée de cellules. Le contrôleur d'affichage original qui contient la vue de table exécute une section à deux occasions différentes: une section lorsque la ligne de cellule elle-même est sélectionnée (segue à un avplayerviewcontroller et lit une vidéo en fonction de la ligne de cellule sélectionnée) vous appuyez sur un bouton situé à l'intérieur de la vue de contenu de la cellule de vue de la table. Dans la première section, je suis en mesure de passer la ligne de la cellule qui est sélectionnée avec if let indexPath = self.tableview.indexPathForSelectedRow lorsque je remplace la première section. Cependant quand j'essaye de passer la rangée de cellules qui a été choisie quand j'essaye de passer outre la deuxième segue qui se produit quand vous appuyez sur le bouton cela ne fonctionne pas. Est-ce parce que le bouton à l'intérieur de la cellule de vue table ne sait pas dans quelle rangée elle a été sélectionnée? Si oui, comment puis-je résoudre ce problème, et si ce n'est pas ce qui est une solution viable pour résoudre ce problème? Rappel: La séquence "playDrill" est déclenchée lorsque vous sélectionnez une rangée de cellules, la séquence "Tips" est déclenchée lorsque vous sélectionnez un bouton dans la vue de contenu de cette même rangéeComment obtenir la ligne de la vue de la table de la table sélectionnée en segue?

Code pour la première séquence qui se produit lorsque vous sélectionnez un rangée de cellules (ce fonctions de Segue comme vous le souhaitez):

class DrillsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    if segue.identifier == "playDrill" { 
     if let indexPath = self.tableView.indexPathForSelectedRow { 
      if initialRow == 1 { 
       drillVid = videoURL[indexPath.row] 
       playerViewController = segue.destination as! PlayerController 
       playerViewController.player = AVPlayer(playerItem: AVPlayerItem(url: drillVid)) 
       playerViewController.player?.play() 
       print(indexPath) //prints correct value which is "[0,6]" 
      } 
      if initialRow == 3 { 
       drillVid = videoUrl[indexPath.row] 
       playerViewController = segue.destination as! PlayerController 
       playerViewController.player = AVPlayer(playerItem: AVPlayerItem(url: drillVid)) 
       playerViewController.player?.play() 
      } 

code pour la deuxième Segue qui déclenche lorsque vous sélectionnez un bouton à l'intérieur de vue du contenu de la cellule (je veux ce Segue d'avoir la valeur de indexPath comme dans le premier Segue , mais lorsque j'essaie d'utiliser ce code, il ne renvoie pas la valeur correcte):

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    if segue.identifier == "Tips" { 
     if let indexPath = self.tableview.indexPathForSelectedRow { 
     if initialRow == 1 { 
      print(indexPath) //the value printed is "6", I want "[0,6]" like the first code block 
      let tipVC = segue.destination as! KeysController 

      } 
     } 
    } 
} 
+1

Je pense en écrivant tant que vous avez fait votre question semble beaucoup plus confus qu'il doit être. Où est le code de l'IBAction du bouton? – Shades

Répondre

0

Vous n'êtes pas en mesure d'obtenir l'index sélectionné de la cellule sélectionnée, car vous ne choisissez pas réellement une cellule. Vous appuyez sur un bouton à l'intérieur de la cellule. Donc, ce que vous faites est d'obtenir une référence sur le bouton, obtenir le superview du bouton (la cellule) et ensuite vous pouvez obtenir le indexPath de cette cellule.

class TableViewController: UITableViewController { 

    var indexPathForButton: IndexPath? 

    @IBAction func buttonPressed(_ sender: UIButton) { 

     let button = sender 
     let cell = button.superview!.superview! as! MyCell // The number of levels deep for superviews depends on whether the button is directly inside the cell or in a view in the cell 
     indexPathForButton = tableView.indexPath(for: cell) 
    } 

Puis, en prepare(for segue:)

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

    if segue.identifier == "Tips" { 
     if initialRow == 1 { 
      print(indexPathForButton) 
      let tipVC = segue.destination as! KeysController 
     } 
    } 
} 
+0

Merci! C'est ce dont j'avais besoin, vérifié vert et voté. –

+0

Où va le premier bloc de code? Je n'ai pas de contrôleur de vue de table. J'ai une vue de table à l'intérieur d'un contrôleur de vue. –

+0

Placez-le dans la classe de contrôleur de vue. Avez-vous déjà un IBAction pour votre bouton? – Shades

0

Je n'ai jamais utilisé tableview.indexPathForSelectedRow (et même si je pense que ce n'est pas une bonne pratique, je ne sais pas si c'est responsable de votre problème), mais une autre approche que vous pouvez essayer est d'envoyer l'objet indexPath comme sender. Cela éviterait d'avoir à vérifier tableview.indexPathForSelectedRow à l'intérieur prepareForSegue. Par exemple,

  • Vous pouvez déclencher votre "playDrill" Segue dans tableView(UITableView, didSelectRowAt: IndexPath) où vous avez accès à ce indexPath et peut simplement passer comme sender.
  • Lors du déclenchement de votre séquence "Tips", vous pouvez également transmettre cet objet indexPath en tant qu'expéditeur. Une façon d'avoir une référence est de garder l'objet indexPath lorsque vous DEQUEUE votre cellule et définir l'action du bouton dans ableView(UITableView, willDisplay: UITableViewCell, forRowAt: IndexPath)

Laissez-moi savoir si cela vous aide! Cheers,

Julien

+0

Pourriez-vous me lier ou fournir du code qui implémente votre réponse? Cela semble valable, mais j'ai un peu de mal à suivre puisque je suis un débutant à Swift! Votre réponse est grandement appréciée! –

1

moi avons eu cette question aussi, il y a quelques mois ...enfin j'ai pu résoudre les tâches suivantes:

  1. Créer une sortie et l'action du bouton dans votre correspondant TableViewCell

  2. Créer un protocole XYTableViewCellDelegate dans votre fichier TableViewCell.swift

  3. Définir un délégué de votre précédent TableViewCell délégué créé dans votre TableViewCell classe

  4. Définir votre délégué en fonction cellForRowAt: de votre tableview

  5. Ajouter le délégué à votre classe ViewController où le TableView est également mis en œuvre

  6. Enfin il suffit de créer cette fonction dans votre ViewController pour recevoir les boutons taraudée tableview indexPath

Si vous avez besoin de plus d'aide à ce sujet, veuillez simplement copier/coller l'ensemble de votre ViewController & classe TableViewCell ici - Nous pouvons faire ensuite les modifications directement dans le code.


Il devrait ressembler le code suivant:

// FILE VIEWCONTORLLER 
// -> 5. 
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, XYTableViewCellDelegate { 

    // ... view did load stuff here 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell:TripDetailsTableViewCell = self.tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell 

     // -> 4. 
     cell.delegate = self 

    // ... 
    } 

    // -> 6. 
    func buttonTappedViewCellResponse(cell: UITableViewCell) { 
    let indexPath = tableView.indexPath(for: cell) 
    // do further stuff here 
    } 
} 


// FILE TABLEVIEWCELL 
// -> 2. 
protocol XYTableViewCellDelegate { 
    func buttonTappedViewCellResponse(cell:UITableViewCell) 
} 
class XYTableViewCell: UITableViewCell { 
    // -> 1. 
    @IBOutlet weak var button: UIButton! 

    // -> 3. 
    var delegate: XYTableViewCellDelegate? 

    // -> 1. 
    @IBAction func buttonAction(_ sender: Any) { 
    self.delegate?.buttonTappedViewCellResponse(cell: self) 
    } 
} 
+0

Quelles sont les flèches pointant vers les nombres représentant? –

+0

Au-dessus du code j'ai énuméré les todos 1 - 6. Les flèches dans le code pointent vers l'article de liste correspondant – AlexWoe89

+0

donc dans le cas de // -> 1. Je veux dire ma liste 1. Créer une sortie et l'action du bouton votre TableViewCell correspondant – AlexWoe89