この回答のカスタムを使用してNavigationButton
、リストから新しいビューに移動するときに特定のビューのデータをロードできるようにしています。それはうまく機能しますが、問題は、ForEach ループ内で使用しようとすると、新しいビューをプッシュするようにすべて指示されている複数の変数を持つ複数のナビゲーション リンクになってしまうことです。これにより、SwiftUI が新しいビューに移動し、自動的に親ビューに戻ります (バグ)。バグを引き起こさずに、新しいビューに移動しながらコードを起動して実行できる機能を維持するにはどうすればよいですか。isActive
@State
ForEach(workouts) { workout in
NavigationButton(
action: {
//load data for Destination
},
destination: {
WorkoutDetailView().environmentObject(dataStore)
},
workoutRow: { WorkoutRow(trackerWorkout: workout) }
)
}
struct NavigationButton<Destination: View, WorkoutRow: View>: View {
var action: () -> Void = { }
var destination: () -> Destination
var workoutRow: () -> WorkoutRow
@State private var isActive: Bool = false
var body: some View {
Button(action: {
self.action()
self.isActive.toggle()
}) {
workoutRow()
.background(
ScrollView { // Fixes a bug where the navigation bar may become hidden on the pushed view
NavigationLink(destination: LazyDestination { self.destination() },
isActive: self.$isActive) { EmptyView() }
}
)
}
}
}
// This view lets us avoid instantiating our Destination before it has been pushed.
struct LazyDestination<Destination: View>: View {
var destination: () -> Destination
var body: some View {
self.destination()
}
}