Passer un paramètre à un VC

colas_colas_ Membre
4 oct. modifié dans Dev. iOS, watchOS, tvOS #1

Bonjour à toutes et à tous,
Je reprends le développement. Nouveautés : sur mon projet Improov, je me mets aux storyboards ; sur un nouveau projet, je me mets à Swift. J'aurai donc sûrement quelques questions...

• J'ai un NavigationController, appelons-le NC_stbo (stbo = "storyboard"). Il n'a pas de custom class.
• "Dans NC_stbo", j'ai un TableViewController "statique" : appelons-le staticTVC_stbo. Il n'a pas de custom class. Il a 3 lignes, toujours les mêmes. Quand je touche une des lignes, c’est la table view suivante qui est affichée :
• Il est suivi (dans NC_stbo , toujours) par un TableViewController "dynamique" : le contenu de ce table view dépend de laquelle des lignes a été touchée. Appelons-le dynTVC_stbo. Il a une custom class associée, appelons-la dynTVC_class.

Pour l'instant, j'ai control-cliqué-glissé chacune des lignes de staticTVC_stbo (l'option "selection") vers dynTVC_stbo.

Comment faire pour prévenir dynTVC_stbo de quelle ligne a été touchée ?

Je vois plusieurs possibilités ; mais toutes nécessitent de créer une classe staticTVC_class custom.

Que feriez-vous ?

Merci
Colas

Réponses

  • DrakenDraken Membre
    4 oct. modifié #2

    Pour autant que je comprenne ton problème, la solution est ..

    @colas_ a dit :
    de créer une classe staticTVC_class custom.

  • colas_colas_ Membre

    Merci.
    J’ai essayé de présenter ma question (simple) de la façon la plus claire... mais j’ai peut-être du coup compliqué les choses.

  • DrakenDraken Membre

    Euh .. oui .. t'as beaucoup complexifié les choses.

    De toutes manières il n'y a pas 36 solutions. Pour passer une information à un viewController le plus simple est de passer par une propriété, ce qui nécessite la création d'une classe spécifique.

  • colas_colas_ Membre

    Merci

    J'imaginais que je pouvais m'en sortir avec les tags (?) et ensuite (de quelle manière ?) "catcher" l'appel à la deuxième Table View pour faire les updates dont j'ai besoin (changer la data source).

    Une image :

  • Joanna CarterJoanna Carter Membre, Modérateur
    4 oct. modifié #6

    Jamais avec les tags !!!

    Et pourquoi quatre segues entre les deux ViewControllers ? Il ne faut qu'un.

    Tes noms pour les composants sont vachement bizarre, voire presque incompréhensible.

    C'est très rare de devoir créer ue class pour le NavigationController et, si tu voulais faire, tu devrais utiliser un nom comme NavigationController.

    Pour les autres classes, tu devrais utiliser les noms qui parlent de la fonctionnalité, comme MenuViewController pour le premier et (peut-être) QuestionsViewController. Mais, de toute façon, arrêtes d'utiliser les noms cryptiques !

    Et, pourquoi tu as "composé" les cellules avec les label et les images ? Il ne faut que choisir les options : Style - Basic et Accessory - Disclosure Indicator.

    Si tu parlais plus de ce que tu veux faire, nous pouvons t'aider plus.

  • colas_colas_ Membre

    Merci de ta réponse Joanna.

    Les noms que j'ai donnés ne sont pas les noms que j'utilise dans mon appli.

    Les 4 flèches que tu vois ne sont pas des Segue (en tout cas je ne crois pas), j'ai juste drag-droppé les UICell sur le deuxième TableView.

    Ce que je veux faire, c'est simple : on clique sur une des trois lignes, ça amène dans l'écran suivant avec une liste différente selon la ligne qui a été touchée. Je sais le faire avec du code. Je vais essayé de le faire "à la mode storyboard"

    PS : oui, je n'ai sous-classé NavigationController.

  • Joanna CarterJoanna Carter Membre, Modérateur
    4 oct. modifié #8

    Dans le storyboard :

    N.B. pas de segue entre les cellules et le deuxième ViewController, seulement un entre les deux ViewControllers

    Dans le code :

    // MenuViewController.swift
    
    enum Sujet : Int, CaseIterable
    {
      case algebre
      case analyse
      case probabilites
    }
    
    
    class MenuViewController: UITableViewController
    {
      var selectedIndexPath: IndexPath?
    
      override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
      {
        selectedIndexPath = indexPath
    
        performSegue(withIdentifier: "ShowQuestions", sender: self)
      }
    
      override func prepare(for segue: UIStoryboardSegue, sender: Any?)
      {
        guard let questionsViewController = segue.destination as? QuestionsViewController,
              let indexPath = selectedIndexPath,
              indexPath.row < Sujet.allCases.count else
        {
          return
        }
    
        questionsViewController.sujet = Sujet(rawValue: indexPath.row)
      }
    }
    
    class QuestionsViewController : UITableViewController
    {
      var sujet: Sujet?
      {
        didSet
        {
          configure()
        }
      }
    
      var questions: [String]?
    
      func configure()
      {
        // créer liste de questions
      }
    
      override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
      {
        // test
        return 3
    
        // exemple
    //    return questions?.count ?? 0
      }
    
      override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
      {
        let cell = tableView.dequeueReusableCell(withIdentifier: "SujetCell", for: indexPath)
    
        // test
        if let sujet = self.sujet,
           let sujetString = String(describing: sujet).components(separatedBy: ".").last?.capitalized
        {
          cell.textLabel?.text = "Question \(indexPath.row) sur \(sujetString)"
        }
    
        // exemple
    //    guard let question = questions?[indexPath.row] else
    //    {
    //      fatalError("no question available for row")
    //    }
    //
    //    cell.textLabel?.text = question
    
        return cell
      }
    }
    
  • colas_colas_ Membre
    4 oct. modifié #9

    Comment fais-tu @Joanna Carter pour créer un Segue entre les View Controller ?
    J'ai fait comme cela :

    0) J'ai Right-cliqué sur l'icône jaune

    1)Puis "Manual Segue"

    2)Puis "Show"

  • Joanna CarterJoanna Carter Membre, Modérateur
    4 oct. modifié #10

    Ou on peut Ctrl-glisser de l'icône jaune vers l'autre controller, puis choisir Show :

    Mais n'oublies pas de mettre l'identifiant pour le segue.

    En regardant ton image, il ne faut pas connecter les cellules avec les segues !

  • colas_colas_ Membre

    Merci !

Connectez-vous ou Inscrivez-vous pour répondre.