SwiftUI'deki UITabViewController, Tab's OnAppear'a İki Kez Çağrılıyor
Dec 17 2020
Şu anda UITabBarController
SwiftUI'de kullanıyorum. İşte uygulama:
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'imin içinde aşağıdakiler var:
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)")
}
}
}
Şu sorularım var:
- Bu kodu çalıştırırken
On Appear Called - Making Service Call for \(text)
, iki kez çağrılır. Buna ne sebep olur? Beklentim sadece bir kez çalıştırılmasıdır. Bu gerçekleşmeli mi? - Bu, etrafta dolaşan bir SwiftUI hatası mı yoksa bu beklenen davranış mı?
Yanıtlar
1 davidev Dec 17 2020 at 11:00
- Evet, beklentiniz doğru olacaktır. Ancak, bir hata gibi görünüyor.
Sorun, içeride içerik varken ortaya çıkıyor NavigationView
. Üzerinde .onAppear () kullanırsanız NavigationView
, yalnızca bir kez çağrıldığını görürsünüz. VStack'te onAppear () kullanırsanız, zaten iki kez.
Bu, bu ileti dizisinde de rapor edildi
- Benim görüşüme göre bu davranış yanlıştır. Belki Apple'a rapor verin veya nedenini sorun
Gene Simmons, KISS Çizgi Romanlarının Potansiyel Olarak "İnsanlığı Yeniden Yaratabileceğini" Söyledi
Nicole Kidman, Michael Keaton ve Val Kilmer'in Batman Olarak Paylaştığı Bu 1 Çekici Özelliğe Bayıldı
Kevin Jonas'ın Kızı Alena, Doğum Günü Fotoğrafında Büyümüş Görünüyor: '9 Yaşında Gerçek Hissetmiyor'