Допустим, у меня есть контент представление с помощью кнопки, которая открывает модальное окно/лист (с именем «Основной вид») с заголовком навигации, панелью поиска и кнопкой. В этом основном представлении строка поиска и заголовок навигации расположены правильно. Когда я нажимаю кнопку с основным видом, он переходит к другому представлению (названному «Подпредставление»), которое имеет панель поиска, заголовок навигации и, в конечном итоге, будет иметь кнопку «Назад» для возврата к основному представлению. В этом дополнительном представлении я вижу, что заголовок навигации и панель поиска расположены неправильно, т. е. между заголовком навигации и панелью поиска много места.
Не могу выяснить причину это и как это исправить... есть какие-нибудь идеи или мысли по этому поводу? Это из-за двух стеков навигации, то есть одного в структуре SampleAppApp, а другого в структуре MainView?
Код:
Код: Выделить всё
import SwiftUI
import Foundation
import Combine
@main
struct SampleAppApp: App {
var body: some Scene {
WindowGroup {
NavigationStack {
ContentView()
}
}
}
}
struct ContentView: View {
@State private var showModal: Bool = false
var body: some View {
VStack {
Button("Click ME", action: { self.showModal.toggle() })
}
.sheet(isPresented: $showModal) {
ZStack {
Color(red: 0.95, green: 0.95, blue: 0.97)
MainView(isPresented: $showModal).padding(.top, 15.0)
}
}
}
}
// MARK: Code for Main View after "Click ME" is clicked
struct MainView: View {
@State private var searchText = ""
let searchTextPublisher = PassthroughSubject()
/// Set to true when the panel is displayed. Dismisses the panel when set to false.
var isPresented: Binding
@State private var showSubView: Bool = false
var body: some View {
NavigationStack {
ZStack {
Color(red: 0.95, green: 0.95, blue: 0.97).edgesIgnoringSafeArea(.all)
VStack {
VStack {
Button("Tap to open sub-view", action: {
self.showSubView.toggle()
}).padding(.top, 20.0)
}
.navigationDestination(isPresented: $showSubView) {
SubView()
}
MainViewSearchResultListAndNavTitle()
.searchable(
text: $searchText,
placement: .navigationBarDrawer(displayMode: .always),
prompt: "search"
)
.onChange(of: searchText) { newText in
searchTextPublisher.send(newText) /// Publishes when a search term is changed. This is used to debounce the search.
}
Spacer()
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color(red: 0.95, green: 0.95, blue: 0.97))
}
}
.presentationDetents([.large])
.interactiveDismissDisabled(true)
.presentationBackgroundInteraction(.enabled)
}
}
/// Shows search bar and search results list.
struct MainViewSearchResultListAndNavTitle: View {
var body: some View {
VStack {
// Contains search results list
}
.toolbar(content: {
ToolbarItem(placement: .navigationBarLeading) {
Text("Main View")
.bold()
.font(.largeTitle)
.padding(.bottom, 15.0)
}
})
.toolbarBackground(Color(red: 0.95, green: 0.95, blue: 0.97), for: .navigationBar)
.toolbarBackground(.visible, for: .navigationBar)
}
}
// MARK: Code for Sub View after "Tap to open sub-view" is clicked. This view will have back button to go back to 2nd view i.e. "Main View".
struct SubView: View {
var body: some View {
ZStack {
Color(red: 0.95, green: 0.95, blue: 0.97).edgesIgnoringSafeArea(.all)
VStack {
SubViewSearchResultsListAndNavTitle()
.searchable(
text: .constant(""),
placement: .navigationBarDrawer(displayMode: .always),
prompt: "search"
)
Spacer()
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(Color(red: 0.95, green: 0.95, blue: 0.97))
}
}
}
private struct SubViewSearchResultsListAndNavTitle: View {
var body: some View {
VStack {
// Contains search results list for sub view.
}
.toolbar(content: {
ToolbarItem(placement: .principal) {
Text("Sub view").bold()
.font(.title)
.padding(.bottom, 15.0)
}
})
.toolbarBackground(Color(red: 0.95, green: 0.95, blue: 0.97), for: .navigationBar)
.toolbarBackground(.visible, for: .navigationBar)
.navigationBarBackButtonHidden(true)
}
}
Подробнее здесь: https://stackoverflow.com/questions/770 ... tion-title