SwiftUI是否可以观察到添加到;选择“;在编辑模式下传递给可选列表的变量

SwiftUI是否可以观察到添加到;选择“;在编辑模式下传递给可选列表的变量,swift,xcode,swiftui,Swift,Xcode,Swiftui,我在我的项目中非常简单地使用了swiftUI列表和编辑模式。这有点像: @State var selection = Set<UUID>() List(selection: $selection) { ForEach(items) { item in Text(item.title) } } 但只有当我重置selection属性时才

我在我的项目中非常简单地使用了swiftUI列表和编辑模式。这有点像:

    @State var selection = Set<UUID>() 

    List(selection: $selection) {
                ForEach(items) { item in
                          Text(item.title)
                    }
    }
但只有当我重置selection属性时才会调用它。但当项目被选中时不会。因此,我假设将项目附加到集合不会触发属性观察器,或者可能是更内在的,因为选择参数是由列表在幕后处理的


但是,问题仍然是,如何通过EditMode保留所选项目的实时计数器?(我不想构建自己的编辑模式)

最简单的方法可能是使用
onChange


struct ContentView : View {
    @State var selection = Set<UUID>()
    @State var items : [Item] = [.init(title: "Test1"),
                                 .init(title: "Test2"),
                                 .init(title: "Test3")]
    
    var body: some View {
        NavigationView {
            List(selection: $selection) {
                        ForEach(items) { item in
                                  Text(item.title)
                            }
            }
            .navigationBarItems(trailing: EditButton())
            .onChange(of: selection) { newSelection in
                print(newSelection.count)
            }
        }
    }
}
最后,作为补充,另一种方法是使用视图模型并结合:

import SwiftUI
import Combine

class ViewModel : ObservableObject {
    @Published var selection = Set<UUID>()
    @Published var items : [Item] = [.init(title: "Test1"),
                                 .init(title: "Test2"),
                                 .init(title: "Test3")]
    
    var cancellable : AnyCancellable?
    
    init() {
        cancellable = $selection.sink {
            print($0.count)
        }
    }
}

struct ContentView : View {
    @StateObject private var viewModel = ViewModel()
    
    var body: some View {
        NavigationView {
            List(selection: $viewModel.selection) {
                ForEach(viewModel.items) { item in
                                  Text(item.title)
                            }
            }
            .navigationBarItems(trailing: EditButton())
        }
    }
}
导入快捷界面
进口联合收割机
类ViewModel:ObservableObject{
@已发布的var selection=Set()
@已发布的变量项:[Item]=[.init(标题:“Test1”),
.init(标题:“Test2”),
.init(标题:“Test3”)]
var可取消:任何可取消?
init(){
可取消=$selection.sink{
打印($0.count)
}
}
}
结构ContentView:View{
@StateObject私有变量viewModel=viewModel()
var body:一些观点{
导航视图{
列表(选择:$viewModel.selection){
ForEach(viewModel.items){item in
文本(项目名称)
}
}
.navigationBarItems(尾部:EditButton())
}
}
}

可能会有帮助好吧,是的,谢谢,一旦改变似乎是最简单的方法,所以我会同意。目前还没有实现viewmodel,但我会把它放在手边以备不时之需。非常感谢。检查我的更新--您甚至可能不需要
onChange
但它不仅仅是一个标签,.count是当.count更改gotcha时我想要运行的另一个函数的参数。在这种情况下,第一种情况可能确实是最简单的。
struct ContentView : View {
    @State var selection = Set<UUID>()
    @State var items : [Item] = [.init(title: "Test1"),
                                 .init(title: "Test2"),
                                 .init(title: "Test3")]
    
    var body: some View {
        NavigationView {
            VStack {
                Text("Number: \(selection.count)")
                List(selection: $selection) {
                    ForEach(items) { item in
                              Text(item.title)
                        }
                }
            }
            .navigationBarItems(trailing: EditButton())
        }
    }
}

import SwiftUI
import Combine

class ViewModel : ObservableObject {
    @Published var selection = Set<UUID>()
    @Published var items : [Item] = [.init(title: "Test1"),
                                 .init(title: "Test2"),
                                 .init(title: "Test3")]
    
    var cancellable : AnyCancellable?
    
    init() {
        cancellable = $selection.sink {
            print($0.count)
        }
    }
}

struct ContentView : View {
    @StateObject private var viewModel = ViewModel()
    
    var body: some View {
        NavigationView {
            List(selection: $viewModel.selection) {
                ForEach(viewModel.items) { item in
                                  Text(item.title)
                            }
            }
            .navigationBarItems(trailing: EditButton())
        }
    }
}