UITabViewController en SwiftUI tiene su pestaña OnAppear que se llama dos veces

Dec 17 2020

Actualmente estoy haciendo uso UITabBarControlleren SwiftUI. Aquí está la implementación:

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
        }
    }
}

Dentro de mi SwiftUI tengo lo siguiente:

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)")
        }
    }
    
}

Tengo las siguientes preguntas:

  1. Cuando se ejecuta este código On Appear Called - Making Service Call for \(text), se llama dos veces. ¿Qué causaría esto? Mi expectativa es que solo se ejecute una vez. ¿Debería estar ocurriendo esto?
  2. ¿Es este un error de SwiftUI acechando o es este comportamiento esperado?

Respuestas

1 davidev Dec 17 2020 at 11:00
  1. Sí, su expectativa sería correcta. Sin embargo, parece un error.

El problema aparece al tener contenido en su interior NavigationView. Si usa .onAppear () en el NavigationView, verá que se llama solo una vez. Si usa onAppear () en VStack, ya es dos veces.

Esto también se ha informado en este hilo

  1. Desde mi punto de vista, este comportamiento es incorrecto. Tal vez informe a Apple o pregunte por qué