SwiftUI VStack spacing: не работает должным образом

У меня есть SwiftUI VStack, который находится внутри scrollView, считывателя геометрии и 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, приложение вылетает.


person Moritz Schaub    schedule 10.04.2020    source источник


Ответы (1)


SwiftUI иногда возникают странные проблемы с поведением при размещении некоторых модификаторов.

В вашем случае, если вы переместите .navigationBarItems на после navigationBarTitle, это должно исправить эту проблему, и вы вернете свой VStack интервал.

.navigationBarTitle("Rezepte")
.navigationBarItems(trailing: Button(action: {
    self.showingAddRecipeView = true
}, label: {
    Image(systemName: "square.and.pencil")
        .foregroundColor(.primary)
}).padding())

Кроме того, я заметил, что лучше иметь эти связанные с навигацией модификаторы ближе к NavigationView, чем глубоко внутри иерархии.


Пример (на основе вашей иерархии представлений):

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")
                        }
                    }
                }
            }
        }
    }
}
person staticVoidMan    schedule 10.04.2020
comment
Я не работаю, если перемещаю navigationBarItemsModifier вниз по вложенному представлению navigationLink мгновенно закрывается наAppear - person Moritz Schaub; 11.04.2020
comment
@EichenherzMo Я тестировал этот ответ на детской площадке, и он помогает решить проблему spacing. Однако автоматическое закрытие листа - это еще одна проблема. Возможно, AddRecipeView устанавливает showingAddRecipeView обратно в значение false onAppear. - person staticVoidMan; 11.04.2020
comment
спасибо за помощь. Я исправил это сам, изменив ForEach на следующее: `` ForEach (0 .. ‹recipeStore.recipes.count, id: \ .self) {number в NavigationLink (destination: RezeptDetail (recipe: self.recipeStore. recipes [число]). environmentObject (self.recipeStore)) {Card (recipe: self.recipeStore.recipes [number], width: UIScreen.main.bounds.width - 30)} .buttonStyle (PlainButtonStyle ())} - person Moritz Schaub; 11.04.2020