SwiftUI presentationMode:检查视图是否由 sheet 呈现

SwiftUI presentationMode: Check if view is presented by sheet

在我的代码中有两种方式显示LoginView

  1. 在 A 视图中,使用 navigationLink
NavigationLink(destination: LoginView()) {
  Text(“To login")
 }
  1. 在 B 视图中,使用 .sheet
.sheet(isPresented: $viewModel.isShowingSheet) {
    LoginView()
}

并且在 LoginView 中,如果 LoginView 显示为 sheet,我想显示我的 Banner,所以我使用了 presentationMode。

struct LoginView: View {
    
    @Environment(\.presentationMode) var presentationMode
    
    var body: some View {
        if presentationMode.wrappedValue.isPresented {
            Banner()
        }
    }
}

但横幅在两种情况下都显示(导航 link 和 sheet)

检查视图是否由 sheet 呈现有什么好方法吗?或者我是否必须使用我自己的 属性 注入演示文稿样式?

为什么不在创建 LoginView 时直接传入值?

struct LoginView: View {
    var showBanner = false
    @Environment(\.presentationMode) var presentationMode
    
    var body: some View {
        if showBanner {
            Banner()
        }
    }
}

当您将其称为 sheet 演示文稿时:

.sheet(isPresented: $viewModel.isShowingSheet) {
    LoginView(showBanner: true)
}

如果您从其他任何地方传递它,请将其初始化为 false。

NavigationLink(destination: LoginView(showBanner: false)) {
  Text(“To login")
 }

明确告诉视图何时显示某些内容并没有错,而不是让视图通过额外的步骤来决定显示什么。而且这种明确性使得测试视图变得更加容易。