UITabViewController di SwiftUI memiliki Tab OnAppear Being Called Twice
Saat ini saya memanfaatkan UITabBarController
SwiftUI. Berikut implementasinya:
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
}
}
}
Di dalam SwiftUI saya, saya memiliki yang berikut:
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)")
}
}
}
Saya memiliki pertanyaan berikut:
- Saat menjalankan kode ini
On Appear Called - Making Service Call for \(text)
, dipanggil dua kali. Apa yang menyebabkan ini? Harapan saya hanya dijalankan sekali. Haruskah ini terjadi? - Apakah ini bug SwiftUI yang mengintai atau apakah ini perilaku yang diharapkan?
Jawaban
1 davidev
- Ya, harapan Anda benar. Namun, sepertinya ada bug.
Masalah muncul saat memiliki konten di dalamnya NavigationView
. Jika Anda menggunakan .onAppear () di NavigationView
, Anda hanya akan melihatnya dipanggil sekali. Jika Anda menggunakan onAppear () di VStack, itu sudah dua kali.
Ini telah dilaporkan di utas ini juga
- Menurut saya, perilaku ini salah. Mungkin melapor ke Apple atau bertanya mengapa