菜单按钮中呈现的表格未显示 - SwiftUI

3

我对SwiftUI还有些陌生。现在我正在尝试从菜单中的按钮呈现一个sheet。我可以使用下面的示例代码复制问题:

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中是否可能实现?


1
这个回答解决了你的问题吗?https://stackoverflow.com/a/65137153/12299030 - Asperi
1个回答

1
您的代码存在几个问题。首先,在ContentView内部,您将Menu放置在ForEach中。这样做会创建四个菜单,每个菜单只有一个按钮,而不是一个菜单有四个按钮。Menu的作用是隐藏按钮,直到需要显示它们。
第二个问题是,您试图从菜单中另一个视图中嵌套的按钮显示一个sheet。实际上,sheet应该在父级中声明,而不是子级,并且我认为您已经混淆了操作系统。尽管如此,我认为您最终打算从不同的按钮调用四个不同的sheet,而Asperi提供的答案将有所帮助,因为您将从一个.sheet中调用不同的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循环里的原因。三个选项没问题,但第四个选项需要显示一个Sheet页面。问题是这个Sheet没显示出来。 - Phantom59
我不认为Asperi的建议有所帮助,但我必须更详细地研究它。 - Phantom59

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接