UITabViewController в SwiftUI имеет вкладку OnAppear, вызываемую дважды
Dec 17 2020
В настоящее время я использую UITabBarController
SwiftUI. Вот реализация:
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)")
}
}
}
У меня следующие вопросы:
- При запуске этого кода
On Appear Called - Making Service Call for \(text)
дважды вызывается. Что могло вызвать это? Я ожидаю, что он будет запущен только один раз. Должно ли это происходить? - Это ошибка SwiftUI или это ожидаемое поведение?
Ответы
1 davidev Dec 17 2020 at 11:00
- Да, ваши ожидания оправдаются. Однако это похоже на ошибку.
Проблема возникает при наличии содержимого внутри NavigationView
. Если вы используете .onAppear () в NavigationView
, вы увидите, что он вызывается только один раз. Если вы используете onAppear () в VStack, это уже дважды.
Об этом также сообщается в этой теме
- На мой взгляд, это неправильное поведение. Может быть, сообщите в Apple или спросите, почему