Avatar
Avatar
zunda
子View(TodoItemView)でデータを変更したい場合は、Bindingを使用するのがSwiftUIでは使いやすいと思います。 Bindingするもの(TodoItem)はclassではなく、structでないとUIが更新されません。 objectWillChangeは使用場面は少ないと思います。 delegateなので値が変わるなどの際には、使用する機会があるかもしれません。 struct ContentView: View { @StateObject var viewModel = TodoList() var body: some View { List { Button("Add Item") { viewModel.add() } ForEach($viewModel.items.sorted { !$0.wrappedValue.completed && $1.wrappedValue.completed }) { TodoItemView(item: $0) } } } } class TodoList: ObservableObject { @Published var items: [TodoItem] = [] func add() { items.append(TodoItem(text: "item: \(items.count)")) } } struct TodoItem: Identifiable { let id = UUID() var completed = false var text: String init(text: String) { self.text = text } } struct TodoItemView: View { @Binding var item: TodoItem var body: some View { HStack { Button( action: { item.completed.toggle() }, label: { Image(systemName: item.completed ? "checkmark.square.fill" : "square") } ) TextField("", text: $item.text) } } } (edited)
おお〜!@Bindingは思いつきませんでした! ↓この書き方もとても参考になりました✨ ありがとうございます! ForEach($viewModel.items.sorted { !$0.wrappedValue.completed && $1.wrappedValue.completed }) { TodoItemView(item: $0) }