iOS 13.0 デバイスのサポートが必要なため、SwiftUI 1.0 でプロジェクトに取り組んできました (利用できませfullScreenCover
ん)。ビュー間でクリーンな遷移アニメーションをアプリケーションに要求するため、GeometryReader
次のようにアプリ全体で広く使用しています。
現在、UI の 80% が完成しており、データ取得部分の統合を少し試みています。onAppear
したがって、私が行ったことは、ビューのメソッドでデータ フェッチ メソッドを呼び出すことでした。これが私のコードです:
struct ContentView: View {
@State private var isUserLoggedIn = false
var body: some View {
GeometryReader { geometry in
HomeView()
LoginView(isUserLoggedIn: $isUserLoggedIn)
.offset(y: isUserLoggedIn ? geometry.size.height + geometry.safeAreaInsets.bottom : 0)
}
}
}
struct LoginView: View {
@Binding var isUserLoggedIn: Bool
var body: some View {
Button("Login") {
withAnimation {
isUserLoggedIn.toggle()
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.red)
.edgesIgnoringSafeArea(.all)
.onAppear {
print("Login appeared!")
}
}
}
struct HomeView: View {
@State private var isTwoSelected = false
var body: some View {
GeometryReader { geometry in
OneView(isTwoSelected: $isTwoSelected)
.offset(x: isTwoSelected ? -geometry.size.width : 0)
TwoView(isTwoSelected: $isTwoSelected)
.offset(x: isTwoSelected ? 0 : geometry.size.width)
}
}
}
struct OneView: View {
@Binding var isTwoSelected: Bool
var body: some View {
NavigationView {
Button("Goto Two") {
withAnimation {
isTwoSelected.toggle()
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.green)
.edgesIgnoringSafeArea(.all)
.navigationBarTitle(Text("One"))
.onAppear {
print("One appeared! Fetch data...")
}
}
}
}
struct TwoView: View {
@Binding var isTwoSelected: Bool
var body: some View {
NavigationView {
Button("Goto One") {
withAnimation {
isTwoSelected.toggle()
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color.yellow)
.edgesIgnoringSafeArea(.all)
.navigationBarTitle(Text("Two"))
.onAppear {
print("Two appeared! Fetch data...")
}
}
}
}
しかし、私が今直面している問題は、それらが一度にトリガーされることです。コンソールに次のように表示されることがわかります。
Login appeared!
Two appeared! Fetch data...
One appeared! Fetch data...
デバイスのビュー フレームに表示されている間だけ、対応するビューにデータをフェッチするにはどうすればよいですか?