SwiftUI 列表选择:最初必须点击两次才能取消选择项目

SwiftUI List Selection: Have to Tap Twice to Deselect Item Initially

为什么要点击两次才能取消选择“项目 1”?难道我做错了什么?如果没有,是否有解决方法?它发生在模拟器和我的 iPhone.

步骤:

  1. 点击“项目 1”。什么都没发生。不要先点击另一个项目。此外,它只发生一次,因此请重新启动应用程序以重试。
  2. 再次点击“项目 1”。已取消选择。
import SwiftUI

struct ContentView: View {
    @State private var selectedItems: Set<Int> = [1]
    
    var body: some View {
        NavigationView { // Some apparent solutions do not work inside a NavigationView
            List(selection: $selectedItems) {
                Text("Item 1").tag(1)
                Text("Item 2").tag(2)
                Text("Item 3").tag(3)
            }.environment(\.editMode, Binding.constant(EditMode.active))
        }
    }
}

不知道为什么,但似乎是对 .environment 的访问。
使用经典的@Environment var 对我有用:

struct ContentView: View {
    
    @State private var selectedItems: Set<Int> = [1]
    @Environment(\.editMode) var editMode
    
    var body: some View {
        
        List(selection: $selectedItems) {
            Text("Item 1").tag(1)
            Text("Item 2").tag(2)
            Text("Item 3").tag(3)
        }
//        .environment(\.editMode, Binding.constant(EditMode.active))
        
        // try this instead
        .onAppear {
            editMode?.wrappedValue = EditMode.active
        }
    }
}

为防止 double-click 问题,请在 onAppear 列表中设置选择:

import SwiftUI

struct ContentView: View {
    @State private var selectedItems: Set<Int> = []
    
    var body: some View {
        NavigationView { // Some apparent solutions do not work inside a NavigationView
            List(selection: $selectedItems) {
                Text("Item 1").tag(1)
                Text("Item 2").tag(2)
                Text("Item 3").tag(3).onAppear() { // onAppear inside the List!
                    selectedItems = [1]
                }
            }.environment(\.editMode, Binding.constant(EditMode.active))
        }
    }
}

请注意,此示例代码在每个 onAppear 上都设置了相同的选择。根据您的应用程序的行为方式,您必须对其进行更改。