2017-08-13 3 views
0

J'ai un UISplitViewController intégré dans une vue conteneur (parce que ce n'est pas à la racine de mon application), dont la mécanique fonctionne bien, sauf pour un problème: La barre de navigation pour le vue de détail est manquant sur l'iPad.Barre de titre manquante dans la vue détaillée de UISplitViewController

configuration initiale est essentiellement comme suit:

  1. Dans IB, faites glisser un contrôleur Scinder sur le story-board, ce qui crée un contrôleur Scinder, un contrôleur de navigation, une table View Controller (Master), un Basic View Controller (Détail), et les liaisons les reliant.
  2. Ajoutez un contrôleur de vue standard avec une vue de conteneur. Créez une Segue intégrée depuis la vue Conteneur vers le contrôleur de vue partagée.
  3. Ajouter un autre Segue de la cellule prototype au détail View Controller, pris en charge par le code suivant dans le contrôleur maître:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    self.performSegue(withIdentifier: "showDetail", sender: nil) 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "showDetail" { 
     let destinationViewController = segue.destination as! DetailViewController 
     let path = self.tableView.indexPathForSelectedRow! as NSIndexPath 
     destinationViewController.selectedTrainingId = (self.itemList[path.row] as! MyListItem).id 
    } 
} 
  1. Ajouter les données

Chargement des éléments dans la vue principale et la sélection du détail fonctionnent.


Voici à quoi il ressemble dans IB (pour économiser l'espace que je montre la mise en page iPhone, mais les relations doivent être visibles de toute façon):

enter image description here

Il y a peu de réponses dans le traitement SO avec problèmes similaires. Les correspondances les plus proches suggèrent d'ajouter un propre contrôleur de navigation pour la vue détaillée. Je n'ai pas compris pourquoi cela serait nécessaire parce que le fait que cela fonctionne comme prévu sur l'iPhone, je crois, montre que la vue de détail utilise le même contrôleur de navigation que la vue maître (racine). Mais j'ai essayé. Le résultat est, comme je le soupçonnais, qu'au départ une barre de navigation est affichée. mais dès qu'un élément est sélectionné, la barre disparaît. Voici la configuration.

enter image description here

Dans de nombreuses applications (messagerie, e-mail, Skype, ...), vous pouvez voir des barres supérieures séparées pour les vues maître et détail. Tandis que techniquement mon application n'a absolument pas besoin des deux, elle n'est pas vraiment jolie surtout avec une barre colorée. Donc, la question est: Comment puis-je obtenir la barre de navigation pour la vue détaillée.

Répondre

0

La vue détaillée a besoin de son propre contrôleur de navigation pour afficher une barre de navigation sur l'iPad. Ainsi, la deuxième image dans la question montre la configuration correcte à l'exception que la séquence de détails doit pointer vers le contrôleur de navigation.

enter image description here

clé est d'obtenir une poignée sur la vue détaillée afin de définir l'identifiant de l'élément sélectionné, ce qui peut être fait avec un petit changement au code d'origine:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "showDetail" { 

     // Destination View Controller 
     let destinationNavigationcontroller: UINavigationController! = segue.destination as! UINavigationController 
     let destinationViewController: DetailViewController! = destinationNavigationcontroller.topViewController as! DetailViewController 

     // Selected Row ID 
     let path = self.tableView.indexPathForSelectedRow! as NSIndexPath 
     destinationViewController.selectedId = (self.itemList[path.row] as! MyListItem).id 
    } 
}