UITabViewController dans SwiftUI a son onglet OnAppear appelé deux fois
Dec 17 2020
J'utilise actuellement UITabBarController
SwiftUI. Voici la mise en œuvre:
struct MyTabView: View {
private var viewControllers: [UIHostingController<AnyView>]
public init( _ views: [AnyView]) {
self.viewControllers = views.map { UIHostingController(rootView:$0) }
}
public var body: some View {
return TabBarController(controllers: viewControllers)
.edgesIgnoringSafeArea(.all)
}
}
struct TabBarController: UIViewControllerRepresentable {
var controllers: [UIViewController]
func makeUIViewController(context: Context) -> UITabBarController {
let tabBarController = UITabBarController()
tabBarController.viewControllers = controllers
return tabBarController
}
func updateUIViewController(_ tabBarController: UITabBarController, context: Context) { }
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
class Coordinator: NSObject, UITabBarControllerDelegate {
var parent: TabBarController
init(_ tabBarController: TabBarController) {
self.parent = tabBarController
}
}
}
À l'intérieur de mon SwiftUI, j'ai les éléments suivants:
struct ContentView: View {
var body: some View {
MyTabView([
AnyView(Text("Moo Moo")),
AnyView(MyPage())
])
}
}
struct MyPage:View {
var body:some View {
NavigationView {
VStack {
ForEach((1...10).reversed(), id: \.self) { value -> AnyView in
print("For Each Value Called")
return AnyView(MyView(text: String(value)))
}
}
}
}
}
struct MyView:View {
let text:String
var body:some View {
Text(text).onAppear {
print("On Appear Called - Making Service Call for \(text)")
}
}
}
J'ai les questions suivantes:
- Lors de l'exécution de ce code, le
On Appear Called - Making Service Call for \(text)
, est appelé deux fois. Qu'est-ce qui causerait cela? Je m'attends à ce qu'il ne soit exécuté qu'une seule fois. Cela devrait-il se produire? - S'agit-il d'un bogue SwiftUI ou s'agit-il d'un comportement attendu?
Réponses
1 davidev Dec 17 2020 at 11:00
- Oui, votre attente serait correcte. Cependant, cela ressemble à un bug.
Le problème apparaît lorsque vous avez du contenu à l'intérieur NavigationView
. Si vous utilisez .onAppear () sur le NavigationView
, vous ne le verrez appelé qu'une seule fois. Si vous utilisez onAppear () sur le VStack, c'est déjà deux fois.
Cela a également été signalé dans ce fil
- De mon point de vue, ce comportement est faux. Peut-être signaler à Apple ou demander pourquoi