【问题标题】:SwiftUI presentationMode: Check if view is presented by sheetSwiftUIpresentationMode:检查视图是否由工作表呈现
【发布时间】:2021-09-25 21:19:56
【问题描述】:

有两种方法可以在我的代码中显示 LoginView

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

LoginView 中,如果LoginView 以表格形式呈现,我想显示我的Banner,所以我使用了presentationMode。

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

但在两种情况下都会显示横幅(导航链接和工作表)

有什么好方法可以检查视图是否由工作表呈现?还是我必须使用自己的属性注入演示样式?

【问题讨论】:

    标签: ios swift swiftui navigation modal-dialog


    【解决方案1】:

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

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

    当您将其称为工作表演示文稿时:

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

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

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

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

    【讨论】:

    • 好吧我只是想知道是否有任何环境属性来检查是否呈现为工作表或导航。感谢您的回答,我将使用额外的 showBanner 属性!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    相关资源
    最近更新 更多