SwiftUI'deki UITabViewController, Tab's OnAppear'a İki Kez Çağrılıyor

Dec 17 2020

Şu anda UITabBarControllerSwiftUI'de kullanıyorum. İşte uygulama:

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

SwiftUI'imin içinde aşağıdakiler var:

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

Şu sorularım var:

  1. Bu kodu çalıştırırken On Appear Called - Making Service Call for \(text), iki kez çağrılır. Buna ne sebep olur? Beklentim sadece bir kez çalıştırılmasıdır. Bu gerçekleşmeli mi?
  2. Bu, etrafta dolaşan bir SwiftUI hatası mı yoksa bu beklenen davranış mı?

Yanıtlar

1 davidev Dec 17 2020 at 11:00
  1. Evet, beklentiniz doğru olacaktır. Ancak, bir hata gibi görünüyor.

Sorun, içeride içerik varken ortaya çıkıyor NavigationView. Üzerinde .onAppear () kullanırsanız NavigationView, yalnızca bir kez çağrıldığını görürsünüz. VStack'te onAppear () kullanırsanız, zaten iki kez.

Bu, bu ileti dizisinde de rapor edildi

  1. Benim görüşüme göre bu davranış yanlıştır. Belki Apple'a rapor verin veya nedenini sorun