Bei UITabViewController in SwiftUI wird OnAppear des Tabs zweimal aufgerufen

Dec 17 2020

Ich verwende derzeit UITabBarControllerSwiftUI. Hier ist die Implementierung:

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

In meinem SwiftUI habe ich Folgendes:

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

Ich habe folgende Fragen:

  1. Wenn Sie diesen Code ausführen On Appear Called - Making Service Call for \(text), wird das, zweimal aufgerufen. Was würde das verursachen? Ich erwarte, dass es nur einmal ausgeführt wird. Sollte dies geschehen?
  2. Ist dies ein SwiftUI-Fehler, der herum lauert, oder ist dies das erwartete Verhalten?

Antworten

1 davidev Dec 17 2020 at 11:00
  1. Ja, Ihre Erwartung wäre richtig. Es sieht jedoch wie ein Fehler aus.

Das Problem tritt auf, wenn Inhalte enthalten sind NavigationView. Wenn Sie .onAppear () auf dem verwenden NavigationView, wird es nur einmal aufgerufen. Wenn Sie onAppear () auf dem VStack verwenden, ist dies bereits zweimal der Fall.

Dies wurde auch in diesem Thread berichtet

  1. Aus meiner Sicht ist dieses Verhalten falsch. Vielleicht melden Sie sich bei Apple oder fragen Sie warum