SwiftUI의 UITabViewController에는 탭의 OnAppear가 두 번 호출됩니다.

Dec 17 2020

현재 UITabBarControllerSwiftUI에서 사용 하고 있습니다. 구현은 다음과 같습니다.

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 내부에는 다음이 있습니다.

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

다음과 같은 질문이 있습니다.

  1. 이 코드를 실행할 때 On Appear Called - Making Service Call for \(text),가 두 번 호출됩니다. 그 원인은 무엇입니까? 내 기대는 한 번만 실행된다는 것입니다. 이것이 발생해야합니까?
  2. 이것은 주변에 숨어있는 SwiftUI 버그입니까 아니면 예상되는 동작입니까?

답변

1 davidev Dec 17 2020 at 11:00
  1. 예, 귀하의 기대는 정확할 것입니다. 그러나 버그처럼 보입니다.

내부에 콘텐츠가있을 때 문제가 나타납니다 NavigationView. 에서 .onAppear ()를 사용 NavigationView하면 한 번만 호출되는 것을 볼 수 있습니다. VStack에서 onAppear ()를 사용하면 이미 두 번입니다.

이것은 또한 이 스레드 에서보고되었습니다

  1. 제 생각에는이 행동이 잘못되었습니다. Apple에보고하거나 이유를 묻습니다.