UITabViewController dans SwiftUI a son onglet OnAppear appelé deux fois

Dec 17 2020

J'utilise actuellement UITabBarControllerSwiftUI. 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:

  1. 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?
  2. 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
  1. 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

  1. De mon point de vue, ce comportement est faux. Peut-être signaler à Apple ou demander pourquoi