我正在開發一個List帶有可選行視圖的 macOS 應用程式。因為不幸的是沒有editMode

在 macOS 上,可以單擊選擇單元格,但取消選擇已選擇的單元格也無濟于事。取消選擇單元格的唯一選項CMD Click不是很直觀。
最小示例:
struct RowsView: View {
@State var selectKeeper: String?
let rows = ["1", "2", "3", "4", "5", "6", "7", "8"]
var body: some View {
List(rows, id: \.self, selection: $selectKeeper) { row in
Text(row)
}
}
}
struct RowsView_Previews: PreviewProvider {
static var previews: some View {
RowsView()
}
}
單擊或什至雙擊單擊第 3 行不執行任何操作,并且該行保持選中狀態。

直接附加系結
我已嘗試按照
struct RowsView: View {
@State var selectKeeper: String?
let rows = ["1", "2", "3", "4", "5", "6", "7", "8"]
var body: some View {
List(rows, id: \.self, selection: $selectKeeper) { row in
Text(row)
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading)
.contentShape(Rectangle()) // handle click row-wide
.listRowInsets(EdgeInsets()) // remove default edges
.onTapGesture {
selectKeeper = selectKeeper == row ? nil : row // << here !!
}
.padding(.vertical, 4) // look&feel like default
}
}
}
uj5u.com熱心網友回復:
我將此答案參考了標題為“在 SwiftUI 串列中選擇多個專案”的 SO 帖子。
從這個答案中,我生成了代碼來選擇串列中的多個專案。
在我的示例代碼中,我使用復選標記來說明是否選擇了一行,但您可以更改它以滿足您的需要。
您需要將@State包裝器更改為 a Set,因為您確認需要選擇一組專案。(順便說一句,Apple 建議您標記@State屬性包裝器,private以便在本地加強它們的預期用途。)
@State private var selectedItems: Set<String>?
let rows = ["1", "2", "3", "4", "5", "6", "7", "8"]
var body: some View {
List(rows, id: \.self) { item in
RowSelectable(selectedItems: $selectedItems, rowItem: item)
}
}
在哪里RowSelectable……
struct RowSelectable: View {
@Binding var selectedItems: Set<String>?
var rowItem: String
var isSelected: Bool {
return selectedItems?.contains(rowItem) == true
}
var body: some View {
HStack {
Text(rowItem)
if selectedItems?.contains(rowItem) == true {
Spacer()
Image(systemName: "checkmark")
}
}
.onTapGesture(count: 1) {
if self.isSelected {
selectedItems!.remove(rowItem)
}
else {
selectedItems!.insert(rowItem)
}
}
}
}
我還沒有測驗過,所以如果它不起作用,請告訴我,我會檢查 Xcode。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/414409.html
標籤:
上一篇:如何在顫動的串列中獲取專案的索引
