【问题标题】:sheet not showing when presented from button in Menu - SwiftUI从菜单中的按钮呈现时工作表不显示 - SwiftUI
【发布时间】:2021-12-20 05:56:54
【问题描述】:

对于 SwiftUI 来说还有一些新东西。现在我正在尝试从菜单中的按钮呈现一张工作表。我可以使用下面的示例代码重现该问题:

import SwiftUI

struct SheetView: View {
  @Environment(\.presentationMode) var presentationMode
  
  var body: some View {
    Button("Press to dismiss") {
      presentationMode.wrappedValue.dismiss()
    }
    .font(.title)
    .padding()
    .background(Color.black)
  }
}

struct TestButtonInMenu: View {
  @State private var showingSheet = false
  
  var body: some View {
    Button("Show Sheet") {
      showingSheet.toggle()
    }
    .sheet(isPresented: $showingSheet) {
      SheetView()
    }
  }
}

enum SampleEnum: String, CaseIterable {
  case one, two, three, four
}

struct ContentView: View {
  var body: some View {
    Form {
      Section {
        VStack  {
          ForEach(SampleEnum.allCases, id:\.self) { id in
            Menu("\(Text(id.rawValue))") {
              TestButtonInMenu()
            }
          }
        }
      }
    }
  }
}

我尝试了不同的工作表初始化程序,但它们没有任何区别。

我错过了什么?这在 SwiftUI 中可行吗?

【问题讨论】:

标签: button swiftui menu


【解决方案1】:

您的代码有几个问题。首先,在ContentView 中,ForEach 内部有Menu。通过这样做,您创建了四个菜单,每个菜单都有一个按钮,而不是一个菜单有四个按钮。 Menu 的重点是隐藏按钮直到需要它们。

第二个问题是您试图显示隐藏在菜单中另一个视图中的按钮的一张表。该表确实应该在父级而不是子级中声明,我认为您已经混淆了操作系统。话虽如此,我认为最终您打算从不同的按钮调用四张不同的工作表,而 Asperi 指出的答案会有所帮助,因为您将从.sheet 调用不同的工作表。我更正了代码,只是将按钮带入了主 UI 并脱离了它自己的结构。

struct SheetView: View {
    @Environment(\.presentationMode) var presentationMode
    
    var body: some View {
        Button("Press to dismiss") {
            presentationMode.wrappedValue.dismiss()
        }
        .font(.title)
        .padding()
        .background(Color.black)
    }
}

enum SampleEnum: String, CaseIterable {
    case one, two, three, four
}

struct ContentView: View {
    @State private var showingSheet = false
    
    var body: some View {
        Form {
            Section {
                VStack  {
                    Menu("Show Sheet") {
                        ForEach(SampleEnum.allCases, id:\.self) { id in
                            Button(id.rawValue) {
                                showingSheet.toggle()
                            }
                        }
                    }
                }
            }
        }
        .sheet(isPresented: $showingSheet) {
            SheetView()
        }
    }
}

【讨论】:

  • 您的重写工作,但它并没有真正重现我的要求。我有一个项目列表(如在 SampleEnum 中)。每个菜单都允许一个菜单提供四个选项(如 UIKit 表中的旧 ContextMenu 和通过长按显示的集合视图)。这就是为什么它位于 ForEach 内部的原因。可以找到三个选项,但第四个选项需要显示工作表。我的问题是工作表没有显示。
  • 我认为 Asperi 的建议也无济于事,但我必须更详细地了解它。
猜你喜欢
  • 2021-04-26
  • 2020-02-19
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
相关资源
最近更新 更多