SwiftUI VStack间距:工作不正常

SwiftUI VStack间距:工作不正常,swift,swiftui-navigationlink,swiftui,Swift,Swiftui Navigationlink,Swiftui,我有一个SwiftUI VStack,它位于scrollView、Geometry reader和NavigationView中,下面是代码: struct RezeptList: View { @Environment(\.colorScheme) var colorScheme: ColorScheme @EnvironmentObject private var recipeStore: RecipeStore @State private var search

我有一个SwiftUI VStack,它位于scrollView、Geometry reader和NavigationView中,下面是代码:

struct RezeptList: View {

    @Environment(\.colorScheme) var colorScheme: ColorScheme
    @EnvironmentObject private var recipeStore: RecipeStore

    @State private var searching = false
    @State private var searchText = ""
    @State private var showingAddRecipeView = false

    var body: some View {
        NavigationView{
            GeometryReader { geo in
                ScrollView {
                    SearchBar(searchText: self.$searchText, isSearching: self.$searching)
                    VStack(spacing: 30) {

                        ForEach(self.recipeStore.recipes.filter{$0.name.hasPrefix(self.searchText) || self.searchText == ""}) {recipe in
                            NavigationLink(destination:
                            RezeptDetail(recipe: recipe).environmentObject(self.recipeStore)) {
                                Card(rezept: recipe,width: geo.size.width - 20)
                            }
                            .buttonStyle(PlainButtonStyle())
                        }

                        .navigationBarItems(trailing: Button(action: {
                            self.showingAddRecipeView = true
                        }){
                            Image(systemName: "square.and.pencil")
                                .foregroundColor(.primary)
                            }
                        .padding()
                        )
                    }
                    .padding(.bottom)
                    .navigationBarTitle("Rezepte")
                    .sheet(isPresented: self.$showingAddRecipeView) {
                        AddRecipeView(isPresented: self.$showingAddRecipeView)
                            .environmentObject(self.recipeStore)
                    }
                }
            }
        }
    }

    init() {
        UINavigationBar.appearance().tintColor = UIColor.label
    }

}
但不管间距大小,它看起来都是这样的:


但我注意到,当我移动.navigationBarItems修改器时,它会工作,但一旦你点击navigationLink,应用程序就会崩溃。

SwiftUI
有时在放置某些修改器时会出现奇怪的行为问题

在您的情况下,如果将
.navigationBarItems
移动到
navigationBarTitle
之后,它将解决此问题,您将获得
VStack
间距

.navigationBarTitle("Rezepte")
.navigationBarItems(trailing: Button(action: {
    self.showingAddRecipeView = true
}, label: {
    Image(systemName: "square.and.pencil")
        .foregroundColor(.primary)
}).padding())
此外,我观察到,与深入层次结构相比,让这些导航相关的修饰符更接近
NavigationView


示例(基于视图层次结构):
如果我将navigationBarItemsModifier向下移动到navigationLink的嵌套视图中,那么我将无法工作,因为它会立即解除自身onAppear@EichenherzMo我在操场上测试了这个答案,它解决了
间距问题。然而,自动撤销的工作表似乎是另一个问题。可能
AddRecipeView
正在将
showingAddressRecipeView
设置为false
onAppear
。感谢您通过将ForEach修改为“ForEach(0。。
struct ContentView: View {
    @State var isShowing: Bool = false
    
    var body: some View {
        NavigationView {
            GeometryReader { (geo) in
                ScrollView {
                    VStack(spacing: 60) {
                        ForEach(0...10, id:\.self) { (index) in
                            NavigationLink(destination: Text(String(index))) {
                                Text("Button")
                            }
                        }
                    }
                    .navigationBarTitle("Title")
                    .navigationBarItems(trailing: Button(action: {
                        self.isShowing = true
                    }, label: {
                        Image(systemName: "square.and.pencil")
                    }))
                    .sheet(isPresented: self.$isShowing) {
                        Button(action: {
                            self.isShowing = false
                        }) {
                            Text("Dismiss")
                        }
                    }
                }
            }
        }
    }
}