如果手动修改选择,则 SwiftUI 的 contextMenu(forSelectionType:menu:primaryAction:) 返回不正确的行数



contextMenu(forSelectionType:menu:primaryAction:)连接到List时,我遇到了一个奇怪的问题。如果您启用编辑模式,并通过点击开始选择行,它会正常工作,但如果您有一个按钮,它所做的是手动修改选择,那么调用contextMenu时返回的行是不正确的。此外,如果使用全选按钮,但实际上滚动到列表的底部,则返回的值是正确的,因此似乎除非渲染单元格,否则contextMenu不会返回它。有人知道我是不是做错了什么吗?这里有一个快速的例子来重现这个问题:

struct ContentView: View {
let rows = (0..<100).map{ "Row: ($0)" }
@State var selection: Set<String> = []
var body: some View {
List(selection: $selection) {
ForEach(rows, id: .self) { row in
Text(row).tag(row)
}
}.contextMenu(forSelectionType: String.self) { contextMenuRows in
Button("Number of rows in the contextMenu: (contextMenuRows.count)") {}
}.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
if selection.isEmpty {
Button("Select All") { selection = Set(rows) }
} else {
Button("Deselect All") { selection = [] }
}
}
ToolbarItem(placement: .navigationBarTrailing) {
EditButton()
}
}
}
}

确保将ContentView嵌入到NavigationView中,以便能够看到导航栏。

显示问题的视频演示:https://i.stack.imgur.com/s7As0.jpg

  1. 手动选择时效果良好
  2. 全选时只显示前9行
  3. 滚动后,所有行都可用于上下文菜单

contextMenuRows(菜单参数(和选择之间存在差异。这可以通过以下方式进行验证:

Button("Number of rows in the contextMenu: (contextMenuRows.count) (selection.count)")

在菜单关闭时使用选择可能正是您想要的。

(奇怪的是,Mac上的"编辑/全选"菜单将contextMenuRows设置为Select(

最新更新