【问题标题】:UITabViewController in SwiftUI has its Tab's OnAppear Being Called TwiceSwiftUI 中的 UITabViewController 的 Tab 的 OnAppear 被调用了两次
【发布时间】:2020-12-17 09:23:57
【问题描述】:

我目前在 SwiftUI 中使用 UITabBarController。这是实现:

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 错误还是预期的行为?

【问题讨论】:

    标签: swiftui


    【解决方案1】:
    1. 是的,您的期望是正确的。但是,它看起来像一个错误。

    NavigationView 中包含内容时会出现问题。如果您在NavigationView 上使用 .onAppear(),您将看到它只被调用一次。如果在 VStack 上使用 onAppear(),已经是两次了。

    这已在this 线程中报告

    1. 在我看来,这种行为是错误的。也许向 Apple 报告或询问原因

    【讨论】:

    • 感谢您的回复。我可以确认是导致问题的 TabView 内的 NavigationView。如果我取消对 NavigationView 的注释,一切都会按预期进行。
    【解决方案2】:

    也许我找到了解决方案: 添加每个第一个 NavigationLink 修饰符 .isDetailLink(false) 对我来说,它停止了双重 onAppear 电话

    【讨论】:

      猜你喜欢
      • 2020-11-14
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多