SwiftUI 中带有嵌套视图的上下文菜单
Context menu in SwiftUI with nested views
在嵌套视图中使用 .contextMenu 视图修饰符时似乎出现了问题。
下面是显示问题的示例代码:
import SwiftUI
enum SampleEnum: String, CaseIterable {
case one, two, three, four
}
struct ContentView: View {
var body: some View {
Form {
Section {
VStack {
HStack {
ForEach(SampleEnum.allCases, id:\.self) { id in
Text(id.rawValue)
.contextMenu {
Button {
print("Change country setting")
} label: {
Label("Choose Country", systemImage: "globe")
}
}
}
}
}
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
结果如下:
因此,似乎无法在单个文本视图上执行上下文菜单,因为整个 section/stack 已被选中。
有什么方法可以让 contextMenu 在这种嵌套布局中的单个文本视图上工作?
试试这个解决方法,我将 contextMenu
更改为 Manu()
并将您的 Text()
作为其参数传递,使每个文本都有自己想要的菜单,并正确打印每个 ID证明每个动作独立于每个 Text()
代码:
struct ContentView: View {
var body: some View {
Form {
Section {
VStack {
HStack {
ForEach(SampleEnum.allCases, id:\.self) { id in
Menu("\(Text(id.rawValue))") {
Button {
print("Change country setting")
print(id)
} label: {
Label("Choose Country", systemImage: "globe")
}
}
}
}
}
}
}
}
}
在嵌套视图中使用 .contextMenu 视图修饰符时似乎出现了问题。
下面是显示问题的示例代码:
import SwiftUI
enum SampleEnum: String, CaseIterable {
case one, two, three, four
}
struct ContentView: View {
var body: some View {
Form {
Section {
VStack {
HStack {
ForEach(SampleEnum.allCases, id:\.self) { id in
Text(id.rawValue)
.contextMenu {
Button {
print("Change country setting")
} label: {
Label("Choose Country", systemImage: "globe")
}
}
}
}
}
}
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
结果如下:
因此,似乎无法在单个文本视图上执行上下文菜单,因为整个 section/stack 已被选中。
有什么方法可以让 contextMenu 在这种嵌套布局中的单个文本视图上工作?
试试这个解决方法,我将 contextMenu
更改为 Manu()
并将您的 Text()
作为其参数传递,使每个文本都有自己想要的菜单,并正确打印每个 ID证明每个动作独立于每个 Text()
代码:
struct ContentView: View {
var body: some View {
Form {
Section {
VStack {
HStack {
ForEach(SampleEnum.allCases, id:\.self) { id in
Menu("\(Text(id.rawValue))") {
Button {
print("Change country setting")
print(id)
} label: {
Label("Choose Country", systemImage: "globe")
}
}
}
}
}
}
}
}
}