Naviguer entre les views à  l'aide d'une tableView

rollanorollano Membre
février 2015 modifié dans API UIKit #1

Bonjour à  tous,


je cherche un moyen de sélectionner mes différents ViewController lorsque les cellules de ma TableView sont sélectionnés (sans utiliser segue de la storyboard = simplement par ce que je vois pas comment  ??? )


 


par exemple :


  • Si je clique sur "We", cela sélectionne la vue correspondante a "We"
  • Si je clique sur "Heart", cela sélectionne la vue correspondante a "Heart"

j'ai pour le moment utilisé ce code qui ne donne rien



if (indexPath.row == selectedMenuItem) {
return
}
selectedMenuItem = indexPath.row

//Present new view controller
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main",bundle: nil)
var destViewController : UIViewController
switch (indexPath.row) {
case 0:
destViewController = mainStoryboard.instantiateViewControllerWithIdentifier("We") as UIViewController
break
case 1:
destViewController = mainStoryboard.instantiateViewControllerWithIdentifier("Hart") as UIViewController
break
default:
destViewController = mainStoryboard.instantiateViewControllerWithIdentifier("Swift") as UIViewController
break
}
//sideMenuController()?.setContentViewController(destViewController)

Merci d'avance pour votre aide et au passage, je suis très très débutant dans la matière  ???


Réponses

  • Joanna CarterJoanna Carter Membre, Modérateur

    Tu n'as pas créé les segues vers les viewControllers dans le storyboard ?


  • non pas de segues vers viewControllers dans le storyboard. Puis que c'est la tableView qui contient les noms des liens je sais pas comment les liés par segues


  • Je crois que je dois utiliser ce bout de code. Mais comment ? Dois-je commencé avec les "prototype Cells" ?



    override func prepareForSegue(_ segue: UIStoryboardSegue, sender sender: AnyObject?) {
    let path = self.tableView.indexPathForSelectedRow()!
    segue.destinationViewController.detail = self.detailForIndexPath(path)
    }
  • Je crois que j'avance un peu.


    Le code ci-dessous me permet maintenant de sélectionner une view. Mais une seule et quelque soit l'identification du segue. comment faire pour afficher différentes view ?



    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    //println("You selected cell #\(indexPath.row)!")

    let cell = tableView.cellForRowAtIndexPath(indexPath)
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
    performSegueWithIdentifier("We", sender: cell)
    performSegueWithIdentifier("Heart", sender: cell)
    performSegueWithIdentifier("Swift", sender: cell) }
  • LarmeLarme Membre
    février 2015 modifié #6

    Un peu de logique s'impose :


     


    tableView:didSelectRowAtIndexPath sera appelé à  chaque fois qu'une cellule est sélectionnée.

    Du coup, comme tu l'as remarqué, en faisant un println de l'indexPath, tu sais quelle cellule a été sélectionnée.

    Dès lors, tu sais en théorie quel prochain ViewController présenter.

    Donc, une analyse sur l'indexPath devrait te permettre de savoir quel segue identifier donner. Et éviter de lancer bêtement les 3 en même temps.

    L'analyse de l'indexPath peut se faire via des if/else, ou des switch.


  • Larme, merci pour ta réponse


     


    Cela, j'ai bien compris. Seulement, dans ma tableView, j'ai des sections. donc mon println renvois "zéro" pour chaque 1ère cellule de chaque section (ce qui est logique).


    Pour effectuer l'analyse j'ai eu recours en effet à  un If/Else ... mais avec la contrainte des sections, pense tu que je devrais faire un premier if/else sur le numéro de ma section, puis un second if/else sur le numéro de mon row ?


  • Cela dépend vraiment de comment est agencée ta TableView.

    Mais en théorie, il y a une sorte d'ordre : Section, puis Row. Ce qui semble logique, si on met ça à  un niveau de livres:  Tome (section), puis Chapitre (row).


    Donc, normalement : un test sur la section, puis sur la row.

  • C'est parfait. je suis passé par le switch finalement.


     


    switch (indexPath.section, indexPath.row)


     


    cela fonction parfaitement bien. 


     


    Merci pour tes conseils


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