SwiftUIのUITabViewControllerには、タブのOnAppearが2回呼び出されています

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回呼び出されます。これは何が原因でしょうか?私の期待は、それが一度だけ実行されることです。これが発生する必要がありますか?
  2. これはSwiftUIのバグが潜んでいるのですか、それともこの予想される動作ですか?

回答

1 davidev Dec 17 2020 at 11:00
  1. はい、あなたの期待は正しいでしょう。ただし、バグのようです。

内にコンテンツがある場合に問題が発生しますNavigationView。で.onAppear()を使用NavigationViewすると、呼び出されるのは1回だけです。VStackでonAppear()を使用する場合、それはすでに2回です。

これはこのスレッドでも報告されています

  1. 私の見解では、この動作は間違っています。たぶんAppleに報告するか、理由を尋ねる