SwiftUI关闭sheet视图的dissmiss方法
SwiftUI关闭sheet视图的dissmiss方法

SwiftUI关闭sheet视图的dissmiss方法

在 SwiftUI 中,dismiss 是用于关闭当前呈现的视图(例如通过 sheet、popover 或 NavigationLink 推入的视图)的机制。可以通过环境值 @Environment(\.dismiss) 获取 dismiss 方法并调用它。

使用方法

1、关闭 sheet 或 popover

当视图是通过 sheet 或 popover 呈现时,可以通过调用 dismiss() 来关闭该视图。

示例

import SwiftUI

struct ContentView: View {
    @State private var isSheetPresented = false

    var body: some View {
        Button("Open Sheet") {
            isSheetPresented = true
        }
        .sheet(isPresented: $isSheetPresented) {
            SheetView()
        }
    }
}

struct SheetView: View {
    @Environment(\.dismiss) var dismiss

    var body: some View {
        VStack {
            Text("This is a sheet")
            Button("Close") {
                dismiss() // 关闭当前的 sheet
            }
        }
        .padding()
    }
}

2、关闭通过 NavigationLink 推入的视图

在导航堆栈中,通过调用 dismiss() 可以返回到上一个视图。

示例

struct ContentView: View {
    var body: some View {
        NavigationStack {
            NavigationLink("Go to Detail") {
                DetailView()
            }
        }
    }
}

struct DetailView: View {
    @Environment(\.dismiss) var dismiss

    var body: some View {
        VStack {
            Text("This is a detail view")
            Button("Go Back") {
                dismiss() // 返回到上一个视图
            }
        }
        .padding()
    }
}

3、处理多层 sheet 或 popover 嵌套

当有多层 sheet 嵌套时,每个 sheet 的 dismiss 环境值仅作用于当前视图。

示例

struct ContentView: View {
    @State private var isSheetPresented = false

    var body: some View {
        Button("Open First Sheet") {
            isSheetPresented = true
        }
        .sheet(isPresented: $isSheetPresented) {
            FirstSheet()
        }
    }
}

struct FirstSheet: View {
    @State private var isSecondSheetPresented = false
    @Environment(\.dismiss) var dismiss

    var body: some View {
        VStack {
            Button("Open Second Sheet") {
                isSecondSheetPresented = true
            }
            .sheet(isPresented: $isSecondSheetPresented) {
                SecondSheet()
            }
            
            Button("Close First Sheet") {
                dismiss() // 关闭第一层 sheet
            }
        }
    }
}

struct SecondSheet: View {
    @Environment(\.dismiss) var dismiss

    var body: some View {
        Button("Close Second Sheet") {
            dismiss() // 关闭第二层 sheet
        }
    }
}

注意事项

1、dismiss 的范围

每个视图实例有独立的 dismiss 环境值,调用 dismiss() 只会关闭该视图。

对于 sheet,需要对应的 isPresented 绑定关闭状态。

2、避免嵌套冲突

当多个视图嵌套时,dismiss 只影响当前视图的呈现状态。

3、适配器视图

在某些情况下(如自定义容器),需要手动管理 isPresented 的状态,而不是依赖 dismiss。

总结

@Environment(\.dismiss) 是关闭当前视图的简便方式,广泛应用于 SwiftUI 的导航堆栈和模态视图中。根据具体场景(如 sheet、popover 或 NavigationLink),可以灵活使用它来管理视图的关闭逻辑。

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开放者。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注