РЕДАКТИРОВАТЬ: Этот ответ здесь лучше, чем мой, но оба работают: SwiftUI отклонить модальный
То, что вы действительно хотите (или должны хотеть), - это модальная презентация, о которой несколько человек упомянули здесь. Если вы пойдете по этому пути, вам определенно потребуется возможность программно отклонить модал, и у Эрики Садун есть отличный пример того, как это сделать здесь: https://ericasadun.com/2019/06/16/swiftui-modal-presentation/
Учитывая разницу между декларативным кодированием и императивным кодированием, решение там может быть неочевидным (например, переключение bool в false для исключения модального режима), но имеет смысл, если ваше состояние модели является источником истины, а не состояние самого пользовательского интерфейса.
Вот мой быстрый пример Эрики, использующий привязку, переданную в TestModal, чтобы он мог отклонить себя, не будучи членом самого ContentView (как Эрика, для простоты).
struct TestModal: View {
@State var isPresented: Binding<Bool>
var body: some View {
Button(action: { self.isPresented.value = false }, label: { Text("Done") })
}
}
struct ContentView : View {
@State var modalPresented = false
var body: some View {
NavigationView {
Text("Hello World")
.navigationBarTitle(Text("View"))
.navigationBarItems(trailing:
Button(action: { self.modalPresented = true }) { Text("Show Modal") })
}
.presentation(self.modalPresented ? Modal(TestModal(isPresented: $modalPresented)) {
self.modalPresented.toggle()
} : nil)
}
}