UITabViewController w SwiftUI ma funkcję OnAppear Being Called Twoing dwukrotnie karty

Dec 17 2020

Obecnie używam UITabBarControllerw SwiftUI. Oto realizacja:

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

W moim SwiftUI mam:

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

Mam następujące pytania:

  1. Podczas uruchamiania tego kodu On Appear Called - Making Service Call for \(text), jest wywoływana dwukrotnie. Co by to spowodowało? Oczekuję, że jest uruchamiany tylko raz. Czy to powinno mieć miejsce?
  2. Czy to błąd SwiftUI czai się w pobliżu, czy jest to oczekiwane zachowanie?

Odpowiedzi

1 davidev Dec 17 2020 at 11:00
  1. Tak, twoje oczekiwanie byłoby słuszne. Jednak wygląda to na błąd.

Problem pojawia się, gdy w środku znajduje się zawartość NavigationView. Jeśli użyjesz .onAppear () w NavigationView, zobaczysz, że wywoływana jest tylko raz. Jeśli używasz onAppear () na VStack, jest to już dwa razy.

To również zostało zgłoszone w tym wątku

  1. Z mojego punktu widzenia to zachowanie jest złe. Może zgłoś się do Apple lub zapytaj, dlaczego