UITabViewController en SwiftUI tiene su pestaña OnAppear que se llama dos veces
Dec 17 2020
Actualmente estoy haciendo uso UITabBarController
en SwiftUI. Aquí está la implementació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
}
}
}
Dentro de mi SwiftUI tengo lo siguiente:
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)")
}
}
}
Tengo las siguientes preguntas:
- Cuando se ejecuta este código
On Appear Called - Making Service Call for \(text)
, se llama dos veces. ¿Qué causaría esto? Mi expectativa es que solo se ejecute una vez. ¿Debería estar ocurriendo esto? - ¿Es este un error de SwiftUI acechando o es este comportamiento esperado?
Respuestas
1 davidev Dec 17 2020 at 11:00
- Sí, su expectativa sería correcta. Sin embargo, parece un error.
El problema aparece al tener contenido en su interior NavigationView
. Si usa .onAppear () en el NavigationView
, verá que se llama solo una vez. Si usa onAppear () en VStack, ya es dos veces.
Esto también se ha informado en este hilo
- Desde mi punto de vista, este comportamiento es incorrecto. Tal vez informe a Apple o pregunte por qué