8
votes

SwiftUI displayModeButtonItem est géré en interne

Je reçois ce message dans la console chaque fois que je navigue vers un autre écran:

ScrollView(showsIndicators: false) {
                        ForEach(notebooks, id: \.self) { notebook in
                            
                            NavigationLink(destination: ExpandedSnippet(matrixVM: saved ,notebook: notebook)
                                            .navigationBarTitle("Notebook", displayMode: .inline)) {
                                SnippetCard(notebook: notebook, matrixVM: saved)
                                    .frame(width: UIScreen.main.bounds.width)
                            }
                            .padding(.bottom, 30)
                        }
                    }

Actuellement, j'ai configuré la vue de navigation dans le point d'entrée de l'application comme ceci

NavigationLink(destination: NotebookView(isNavigationBarHidden: $isNavigationBarHidden, saved: matrixVM), label: {
                            Text("Notebooks")
                                .font(.system(size: 14, design: .rounded))
                                .fontWeight(.medium)
                                .foregroundColor(Color("text"))
                                .padding(.trailing, 10)
                        })

Et puis à l'intérieur de KeyboardView, j'ai le lien de navigation

NavigationView {
        KeyboardView(matrixVM: matrixVM, isNavigationBarHidden: $isNavigationBarHidden)
            .background(Color("background")
            .edgesIgnoringSafeArea(.all))
            .navigationBarTitle("Workspace")
            .navigationBarHidden(self.isNavigationBarHidden)
            .onAppear {
                self.isNavigationBarHidden = true
        }
    }

À l'intérieur du NotebookView, j'ai une liste de liens de navigation (chaque bloc-notes renvoyant à sa page de détail)

[Assert] displayModeButtonItem is internally managed and not exposed for DoubleColumn style. Returning an empty, disconnected UIBarButtonItem to fulfill the non-null contract.

Tout semble fonctionner, mais il y a quelques heures à peine, ce n'était pas le cas (j'utilisais la barre d'onglets et cela a soudainement commencé à planter après avoir travaillé pendant des semaines). J'ai l'impression que c'est un peu le bordel et que je fais quelque chose de mal. Une idée pourquoi? Merci pour l'aide!


0 commentaires

3 Réponses :


9
votes

En utilisant Xcode 12.1 (12A7403), cela semble être résolu.

La réponse précédente reste ci-dessous pour la postérité.

J'ai rencontré cela plus tôt également en utilisant la dernière version bêta de Xcode 12 (12A8189).

Cela fournit un MVP simple pour illustrer le problème.

import SwiftUI

struct ContentView: View {
    var body: some View {
        NavigationView {
            List {
                NavigationLink(destination: DetailView()) {
                    Text("First View")
                }
            }
            .navigationViewStyle(StackNavigationViewStyle())
        }
    }
}

struct DetailView: View {
    var body: some View {
        List {
            NavigationLink(destination: Text("Detail Title")) {
                Text("New View")
            }
        }
        .navigationBarItems(trailing:
                                Button(action: {
                                    print("Clicked")
                                }) {
                                    Image(systemName: "square.and.arrow.up")
                                })
    }
}

Le problème se résume à l'appareil que j'utilise.

Lors de l'exécution de ceci sur un iPhone, je verrai le message que OP publie.

Lorsque je l'exécute sur un iPad, je ne vois aucun message.

Maintenant, pourquoi fait-il cela?

Pour commencer, vous pouvez consulter cette référence Apple pour le displayModeButtonItem auquel l'assertion fait référence.

Ou, regardez les captures d'écran du code ci-dessus en action.

iPhone:

entrez la description de l'image ici

iPad:

entrez la description de l'image ici

Remarquez comment l'iPad affiche l'icône de displayModeButtonItem , displayModeButtonItem l'iPhone.

Sur cette base, je pense qu'Apple a commis une erreur. Peut-être que cela sera corrigé dans la prochaine version?

La meilleure chose à faire serait de signaler un bogue .

FWIW, j'ai regardé les notes de publication et je n'ai trouvé aucune référence à cela.


0 commentaires

1
votes

J'obtiens cela avec Xcode 12.1 lors de l'exécution sur le simulateur iPhone ou iPhone mais pas sur le simulateur iPad.

Joindre ceci à NavigationView l'a corrigé pour moi.

.navigationViewStyle(StackNavigationViewStyle())


0 commentaires

0
votes

.navigationViewStyle(StackNavigationViewStyle()) à NavigationView fait effectivement taire l'erreur.

Malheureusement, ce n'est pas toujours une solution souhaitable, et peut parfois introduire un autre bogue existant spécifique à StackNavigationViewStyle() dans lequel: la couleur d'arrière-plan d'une ligne de liste sélectionnée reste grise après le retour .


0 commentaires