Created
October 6, 2020 10:26
-
-
Save NewFieldForMe/b48ba76c5bd919372545307e31743b0c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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