// // View+Navigation.swift // Recipes // // Created by Paul Kraft on 05.01.21. // import SwiftUI extension View { func onNavigation(_ action: @escaping () -> Void) -> some View { let isActive = Binding( get: { false }, set: { newValue in if newValue { action() } } ) return NavigationLink( destination: EmptyView(), isActive: isActive ) { self } } func navigation( item: Binding, @ViewBuilder destination: (Item) -> Destination ) -> some View { let isActive = Binding( get: { item.wrappedValue != nil }, set: { value in if !value { item.wrappedValue = nil } } ) return navigation(isActive: isActive) { item.wrappedValue.map(destination) } } func navigation( isActive: Binding, @ViewBuilder destination: () -> Destination ) -> some View { overlay( NavigationLink( destination: isActive.wrappedValue ? destination() : nil, isActive: isActive, label: { EmptyView() } ) ) } } extension NavigationLink { init(item: Binding, @ViewBuilder destination: (T) -> D, @ViewBuilder label: () -> Label) where Destination == D? { let isActive = Binding( get: { item.wrappedValue != nil }, set: { value in if !value { item.wrappedValue = nil } } ) self.init( destination: item.wrappedValue.map(destination), isActive: isActive, label: label ) } }