我依靠SwiftUI的.onDisappear
来执行一些逻辑,但是当用户使用滑动手势关闭模态呈现的视图时,不会调用它。再现
未调用“ ChildView 2”的.onDisappear。
要复制的示例代码
import SwiftUI
struct ContentView: View {
@State var isShowingModal
var body: some View {
NavigationView {
Button(action: {
self.isShowingModal.toggle()
}) {
Text("Show Modal")
}
}
.sheet(isPresented: $isShowingModal) {
NavigationView {
ChildView(title: 1)
}
}
}
}
struct ChildView: View {
let title: Int
var body: some View {
NavigationLink(destination: ChildView(title: title + 1)) {
Text("Show Child")
}
.navigationBarTitle("View \(title)")
.onAppear {
print("onAppear ChildView \(self.title)")
}
.onDisappear {
print("onDisappear ChildView \(self.title)")
}
}
}
输出为:
onAppear ChildView 1
onAppear ChildView 2
onDisappear ChildView 1
答案 0 :(得分:2)
如果您希望在取消实际模态时发生逻辑,您将要在这里调用,在此我打印出模态已取消:
struct ContentView: View {
@State var isShowingModal = false
var body: some View {
NavigationView {
Button(action: {
self.isShowingModal.toggle()
}) {
Text("Show Modal")
}
}
.sheet(isPresented: $isShowingModal) {
NavigationView {
ChildView(title: 1)
}
.onDisappear {
print("Modal Dismissed")
}
}
}
}
答案 1 :(得分:0)
struct ContentView: View {
@State var isShowingModal = false
var body: some View {
NavigationView {
Button(action: {
self.isShowingModal.toggle()
}) {
Text("Show Modal")
}
}
.sheet(isPresented: $isShowingModal) {
NavigationView {
ChildView(title: 1)
}
}
}
}
在此代码中,您具有NavigationView,在显示工作表时,将另一个NavigationView推到那里。这是麻烦的根源
您不需要任何NavigationView即可显示模态。如果您希望从模态中呈现另一个模态,则可以使用
import SwiftUI
struct ContentView: View {
var body: some View {
ChildView(title: 1)
}
}
struct ChildView: View {
@State var isShowingModal = false
let title: Int
var body: some View {
Button(action: {
self.isShowingModal.toggle()
}) {
Text("Show Modal \(title)").font(.largeTitle)
}
.sheet(isPresented: $isShowingModal) {
ChildView(title: self.title + 1)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
更新
来自苹果的人机界面指南
模式是一种设计技术,它以一种临时模式来呈现内容,该模式与用户以前的当前上下文是分开的,并且需要采取明确的措施才能退出