1

この回答のカスタムを使用して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()
    }
}
4

0 に答える 0