UITabViewController em SwiftUI tem seu Tab OnAppear sendo chamado duas vezes

Dec 17 2020

Atualmente estou fazendo uso UITabBarControllerno SwiftUI. Aqui está a implementação:

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 da minha SwiftUI eu tenho o seguinte:

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

Tenho as seguintes perguntas:

  1. Ao executar este código On Appear Called - Making Service Call for \(text), o , é chamado duas vezes. O que causaria isso? Minha expectativa é que seja executado apenas uma vez. Isso deveria estar ocorrendo?
  2. É um bug SwiftUI à espreita ou é um comportamento esperado?

Respostas

1 davidev Dec 17 2020 at 11:00
  1. Sim, sua expectativa seria correta. No entanto, parece um bug.

O problema aparece quando há conteúdo dentro NavigationView. Se você usar .onAppear () no NavigationView, verá que ele é chamado apenas uma vez. Se você usar onAppear () no VStack, já é duas vezes.

Isso também foi relatado neste tópico

  1. Do meu ponto de vista, esse comportamento está errado. Talvez reporte à Apple ou pergunte por quê