UITabViewController di SwiftUI memiliki Tab OnAppear Being Called Twice
Dec 17 2020
Saat ini saya memanfaatkan UITabBarControllerSwiftUI. 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 Dec 17 2020 at 11:00
- 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
Jana Duggar: Semua yang Dia Katakan Tentang Cinta dan Jendela 5 Tahunnya untuk Menemukan 'Yang Satu'