Mise à jour pour 13.4
note : en réexaminant cette question le lendemain, il est possible que certains de mes problèmes aient été causés par ma configuration quelque peu atypique : je suis toujours sous mojave, mais j'ai ajouté manuellement les fichiers de support 13.4 (normalement disponibles uniquement via xcode 11.4, qui nécessite catalina). je mentionne ceci parce que j'ai/avais également des problèmes de couleur personnalisée de la barre d'onglets, mais je viens de remarquer que ceux-ci ne se manifestent que lorsque j'ai le téléphone branché et que j'exécute l'application depuis xcode. si je débranche et que j'exécute l'application normalement, je ne vois pas les problèmes de la barre d'onglets, il est donc possible que le problème de la barre de navigation ait une certaine similitude ...
(j'ajouterais bien ceci en commentaire de la réponse d'arsenius (celle qui est actuellement acceptée) ci-dessus, mais je n'ai pas de représentant, donc ...)
J'utilisais cette solution et elle fonctionnait parfaitement jusqu'à la version 13.4, qui semble l'avoir cassée, du moins pour moi. Après de nombreuses recherches sur la hiérarchie des vues, il semble qu'ils aient modifié les choses de telle sorte que le UINavigationController implicite n'est plus facilement accessible via le UIViewController passé, comme décrit dans la solution de contournement. Il est toujours là cependant (assez loin dans l'arbre), il faut juste le trouver.
à cette fin, nous pouvons simplement parcourir la hiérarchie des vues jusqu'à ce que nous trouvions la barre de navigation, et ensuite définir les paramètres souhaités sur celle-ci, comme d'habitude. cela nécessite une nouvelle fonction de découverte, et quelques changements mineurs à la structure NavigationConfigurator, et son instanciation ...
Tout d'abord, la fonction de découverte :
func find_navbar(_ root: UIView?) -> UINavigationBar?
{
guard root != nil else { return nil }
var navbar: UINavigationBar? = nil
for v in root!.subviews
{ if type(of: v) == UINavigationBar.self { navbar = (v as! UINavigationBar); break }
else { navbar = find_navbar(v); if navbar != nil { break } }
}
return navbar
}
modifier le NavigationConfigurator comme suit (notez que nous ne nous soucions plus de passer dans une vue, puisque ce n'est plus fiable) :
struct NavigationConfigurator: UIViewControllerRepresentable
{
@EnvironmentObject var prefs: Prefs // to pick up colorscheme changes
var configure: () -> Void = {}
func makeUIViewController(context: UIViewControllerRepresentableContext<NavigationConfigurator>) -> UIViewController { UIViewController() }
func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<NavigationConfigurator>) { self.configure() }
}
(dans mon application, j'ai un objet Prefs qui garde la trace des couleurs, etc.)
... puis, au site d'instanciation, faites quelque chose comme ceci :
MyView()
.navigationBarTitle("List", displayMode: .inline)
.navigationBarItems(trailing: navbuttons)
.background(NavigationConfigurator {
if self.prefs.UI_COLORSCHEME != Colorscheme.system.rawValue
{ if let navbar = find_navbar(root_vc?.view)
{ navbar.barTintColor = Colors.uicolor(.navbar, .background)
navbar.backgroundColor = .black
navbar.titleTextAttributes = [.foregroundColor: Colors.uicolor(.navbar, .foreground)]
navbar.tintColor = Colors.uicolor(.navbar, .foreground)
}
}
})
notez que j'ai capturé le contrôleur de vue Root ailleurs dans mon application, et que je l'utilise ici pour le passer à find_navbar(). vous pourriez vouloir le faire différemment, mais j'ai déjà cette variable pour d'autres raisons ... il y a d'autres choses spécifiques à mon application, par exemple, les objets liés à la couleur, mais vous voyez l'idée.
3 votes
Hm... il semble que swiftUI ignore tout modificateur défini pour le titre de la barre de navigation... Et il est également étrange que nous ne pouvons pas mettre n'importe quelle vue dans la barre de navigation :-(