SwiftUI是否可以观察到添加到;选择“;在编辑模式下传递给可选列表的变量
我在我的项目中非常简单地使用了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属性时才
@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())
}
}
}