UITabViewController trong SwiftUI có Tab OnAppear được gọi hai lần

Dec 17 2020

Tôi hiện đang sử dụng UITabBarControllerSwiftUI. Đây là cách thực hiện:

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

Bên trong SwiftUI của tôi, tôi có những thứ sau:

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

Tôi có những câu hỏi sau:

  1. Khi chạy mã này On Appear Called - Making Service Call for \(text), được gọi hai lần. Điều gì sẽ gây ra điều này? Kỳ vọng của tôi là nó chỉ được chạy một lần. Điều này có nên xảy ra không?
  2. Đây có phải là một lỗi SwiftUI đang rình rập hay đây là hành vi được mong đợi?

Trả lời

1 davidev Dec 17 2020 at 11:00
  1. Có, kỳ vọng của bạn sẽ đúng. Tuy nhiên, nó trông giống như một lỗi.

Sự cố xuất hiện khi có nội dung bên trong NavigationView. Nếu bạn sử dụng .onAppear () trên NavigationView, bạn sẽ thấy nó chỉ được gọi một lần. Nếu bạn sử dụng onAppear () trên VStack, nó đã hai lần.

Điều này cũng đã được báo cáo trong chuỗi này

  1. Theo quan điểm của tôi, hành vi này là sai. Có thể báo cáo với Apple hoặc hỏi tại sao