SwiftUI의 UITabViewController에는 탭의 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
하면 한 번만 호출되는 것을 볼 수 있습니다. VStack에서 onAppear ()를 사용하면 이미 두 번입니다.
이것은 또한 이 스레드 에서보고되었습니다
- 제 생각에는이 행동이 잘못되었습니다. Apple에보고하거나 이유를 묻습니다.