UiftabViewController में SwiftUI के पास अपने Tab का OnAppear Being Called Twice है
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
}
}
}
मेरे स्विफ्टयूआई के अंदर मेरे पास निम्नलिखित हैं:
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)
, दो बार कहा जाता है। इसका क्या कारण होगा? मेरी अपेक्षा यह है कि यह केवल एक बार चलाया जाए। क्या ऐसा होना चाहिए? - क्या यह एक स्विफ्टयूआई बग के आसपास दुबका हुआ है या यह अपेक्षित व्यवहार है?
जवाब
1 davidev Dec 17 2020 at 11:00
- हां, आपकी अपेक्षा सही होगी। हालांकि, यह एक बग की तरह दिखता है।
अंदर सामग्री होने पर समस्या प्रकट होती है NavigationView
। यदि आप .onAppear () का उपयोग करते हैं NavigationView
, तो आप इसे केवल एक बार कॉल करेंगे। यदि आप VStack पर onAppear () का उपयोग करते हैं, तो यह पहले से ही दो बार है।
इस सूत्र में यह बताया गया है
- मेरे विचार से, यह व्यवहार गलत है। शायद Apple को रिपोर्ट करें या पूछें कि क्यों