将 contextMenu 添加到列表中的按钮会阻止默认按钮功能

Adding contextMenu to a Button within a List prevents default Button functionality

我正在尝试创建一个列表,其中包含在 tap/click 上发生并支持上下文菜单的操作。

按钮在列表外 (#1) 确实支持 contextMenu,但在列表内 (#2),点击不再被识别,尽管 contextMenu 仍然有效。这是故意的吗?

struct ContextMenu: View {
    @State var on = false

    var button: some View {
        Button(action: { self.on.toggle() }) {
            Text("Toggle")
        }
    }

    var body: some View {
        VStack {
            Text(on ? "on" : "off")

            // #1: works for both tap and context
            button.contextMenu {
                button
            }

            // #2: tap on button no longer works
            List {
                button.contextMenu {
                    button
                }
            }
        }
    }
}

我也试过将 .buttonStyle(BorderlessButtonStyle() 添加到按钮。这会启用点击,但仅限于文本,而不是整行。

其实这个问题要问苹果...同时这里有一个可能的解决方案。使用 Xcode 11.4

测试
List {
    button
        .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading)
        .contentShape(Rectangle())
        .contextMenu {
            button
        }.onTapGesture {
            self.on.toggle()
        }
}

如果您想要在行点击时突出显示,则需要应用自定义 ButtonStyle。例如,您可以考虑

中的解决方案