Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save NewFieldForMe/b48ba76c5bd919372545307e31743b0c to your computer and use it in GitHub Desktop.
Save NewFieldForMe/b48ba76c5bd919372545307e31743b0c to your computer and use it in GitHub Desktop.
import SwiftUI
import Combine
struct ContentView: View {
@ObservedObject var vm = ContentViewModel()
var body: some View {
List {
Section(header: Text("Check False")) {
ForEach(vm.items.filter { $0.check == false }) { item in
ItemCell(vm: ItemCellViewModel(item: item))
}
}
Section(header: Text("Check True")) {
ForEach(vm.items.filter { $0.check == true }) { item in
ItemCell(vm: ItemCellViewModel(item: item))
}
}
}
}
}
class ContentViewModel: ObservableObject {
let items = Item.make()
private var bag = [AnyCancellable]()
init() {
items.forEach { [weak self] item in
guard let strongSelf = self else { return }
item.objectWillChange.sink {
strongSelf.objectWillChange.send()
}.store(in: &strongSelf.bag)
}
}
}
class ItemCellViewModel: ObservableObject {
let item: Item
@Published var stateSystemName: String = ""
private var bag = [AnyCancellable]()
init(item: Item) {
self.item = item
item.$check.map {
$0 ? "checkmark.square" : "square"
}
.assign(to: \.stateSystemName , on: self)
.store(in: &bag)
}
func switchItem() {
item.check.toggle()
}
}
struct ItemCell: View {
@ObservedObject var vm: ItemCellViewModel
var body: some View {
HStack {
Image(systemName: vm.stateSystemName)
.onTapGesture {
self.vm.switchItem()
}
Text(vm.item.title)
}
}
}
class Item: Identifiable, ObservableObject {
let id = UUID()
let title: String
@Published var check: Bool
init(title: String, check: Bool) {
self.title = title
self.check = check
}
static func make() -> [Item] {
return [
Item(title: "(´・ω・`)", check: true),
Item(title: "( ᐛ👐)パァ", check: true),
Item(title: "( ᐛ🐾)ニャア", check: false),
Item(title: "٩( ᐛ )و.", check: false),
Item(title: "( ´・ω・`)人(´・ω・` )", check: false)
]
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment