UITabViewController di SwiftUI memiliki Tab OnAppear Being Called Twice

Dec 17 2020

Saat ini saya memanfaatkan UITabBarControllerSwiftUI. Berikut implementasinya:

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

Di dalam SwiftUI saya, saya memiliki yang berikut:

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

Saya memiliki pertanyaan berikut:

  1. Saat menjalankan kode ini On Appear Called - Making Service Call for \(text), dipanggil dua kali. Apa yang menyebabkan ini? Harapan saya hanya dijalankan sekali. Haruskah ini terjadi?
  2. Apakah ini bug SwiftUI yang mengintai atau apakah ini perilaku yang diharapkan?

Jawaban

1 davidev Dec 17 2020 at 11:00
  1. Ya, harapan Anda benar. Namun, sepertinya ada bug.

Masalah muncul saat memiliki konten di dalamnya NavigationView. Jika Anda menggunakan .onAppear () di NavigationView, Anda hanya akan melihatnya dipanggil sekali. Jika Anda menggunakan onAppear () di VStack, itu sudah dua kali.

Ini telah dilaporkan di utas ini juga

  1. Menurut saya, perilaku ini salah. Mungkin melapor ke Apple atau bertanya mengapa