web-dev-qa-db-fra.com

SwiftUI Navigation sur iPad - Comment afficher la liste principale

Mon application a des besoins de navigation simples

  • Vue Liste (objets parents)
  • Affichage de liste (objets enfants)
  • Vue détaillée (objet enfant)

J'ai cette configuration et je travaille sur iPhone, mais lorsque je lance l'application sur iPad en mode portrait, la liste principale est toujours masquée.

J'utilise .isDetailLink(false) sur le lien de navigation de la première liste à la seconde, donc les deux listes restent toujours dans la colonne principale. En mode iPad, tout fonctionne comme prévu, mais en mode portrait, la vue détaillée remplit l'écran. Je peux glisser depuis le côté gauche de l'écran pour afficher la liste, mais je voudrais apporter plus de clarté à l'utilisateur.

Je voudrais afficher ou ajouter le bouton de retour pour afficher le côté maître/liste (un peu comme le Apple = Application Notes) Sur l'iPhone j'obtiens le bouton de retour par défaut mais sur l'iPad en mode portrait il n'y a rien à sa place.

C'est ce que je vois sur iPhone enter image description here

Mais c'est ce que je vois sur iPad enter image description here

Liste des parents

struct ParentList: View {

    let firstList = ["Sample data 01", "Sample data 02", "Sample data 03", "Sample data 04", "Sample data 05"]

    var body: some View {
        NavigationView {
            List{
                ForEach(firstList, id: \.self) { item in
                    NavigationLink(destination: ChildList()){

                        Text(item)
                    }
                    .isDetailLink(false)

                }
            }
        }
    }
}

Liste d'enfants

struct ChildList: View {

    let secondList = ["More Sample data 01", "More Sample data 02", "More Sample data 03", "More Sample data 04", "More Sample data 05"]

    var body: some View {
        List{
            ForEach(secondList, id: \.self) { item in
                NavigationLink(destination: ChildDetail()){

                    Text(item)

                }
            }
        }
    }
}

Détail enfant

struct ChildDetail: View {

    var body: some View {
        Text("Child detail view")
    }

}

Mise à jour: Au 17 octobre 2019, je n'avais pas trouvé de moyen de faire fonctionner cela. J'ai décidé d'utiliser .navigationViewStyle(StackNavigationViewStyle()) pour le moment. Fait intéressant, cela doit aller à l'extérieur de la vue de navigation comme un modificateur normal, pas à l'intérieur avec le titre de navigation.

10
radicalappdev

En mode portrait, la vue fractionnée par défaut ne fonctionne pas. Cela peut être résolu à l'avenir, mais il semble que les options actuelles soient:
(a) changez le style de vue de navigation de votre première liste en .navigationViewStyle (StackNavigationViewStyle () pour que la navigation fonctionne comme sur iPhone et pousse chaque vue.

(b) laissez le style par défaut et ne supportez que le paysage pour iPad

(c) implémenter un contrôleur de vue fractionnée UIKit

13
ptc

Il existe également une solution de contournement assez hacky (voir https://stackoverflow.com/a/57215664/3187762 )

En ajoutant .padding () à la NavigationView, il semble obtenir le comportement de toujours afficher le maître.

NavigationView {
        MyMasterView()
        DetailsView()
 }.navigationViewStyle(DoubleColumnNavigationViewStyle())
  .padding()

Je ne sais pas si c'est prévu. Peut se casser à l'avenir (fonctionne avec Xcode 11.0, dans le simulateur sur iOS 13.0 et l'appareil avec 13.1.2).

Vous ne devez pas vous y fier. Ce commentaire semble être la meilleure réponse: https://stackoverflow.com/a/57919024/3187762

6
simonnickel

dans iOS 13.4, un bouton "retour à la vue principale" a été ajouté à la disposition de l'iPad. D'après les notes de version:

Lorsque vous utilisez un NavigationView avec plusieurs colonnes, la barre de navigation affiche désormais un contrôle pour basculer entre les colonnes. (49074511)

2
Benjamin Kindle