Вам необходимо создать запрос, чтобы изменить состояние флага isSelected
. Эту логику c лучше держать вне системы просмотра, чтобы вы могли использовать ее где угодно
Вы создаете SelectionHandler
import CoreData
class SelectionHandler {
func clearSelection(in context: NSManagedObjectContext) {
for item in currentSelected(in: context) {
item.isSelected = false
}
}
func selectProduct(_ product: Product) {
guard let context = product.managedObjectContext else {
assertionFailure("broken !")
return
}
clearSelection(in: context)
product.isSelected = true
}
func currentSelected(in context: NSManagedObjectContext) -> [Product] {
let request = NSFetchRequest<Product>(entityName: Product.entity().name!)
let predicate = NSPredicate(format: "isSelected == YES")
request.predicate = predicate
do {
let result = try context.fetch(request)
return result
} catch {
print("fetch error =",error)
return []
}
}
}
, который затем можно использовать для выбора желаемого продукта.
SelectionHandler().selectProduct(product)
В нынешнем виде NavigationLink
ничего не будет делать, поскольку родительский список не содержится в NavigationView
, поэтому вам нужно изменить тело ViewList
var body: some View {
NavigationView {
VStack {
HStack {
TextField("Create product with name", text: $newName)
Button(action: {
self.add()
self.newName = ""
})
{ Image(systemName: "plus") }
}
.padding()
List {
ForEach(list, id: \.self) { product in
ViewItem(product: product)
}
}
}
}
}
, а в ViewItem
Product
должно быть ObservedObject
, чтобы изменения обнаруживались в управляемом объекте.
struct ViewItem: View {
@ObservedObject var product: Product
@State var refresh: Bool = false
var checkmarkImage: some View {
return Group {
if self.product.isSelected {
Image(systemName: "checkmark")
} else {
Image(systemName: "checkmark").colorInvert()
}
}
}
var body: some View {
NavigationLink(destination: ViewDetail(product: product, refresh: $refresh)) {
HStack {
checkmarkImage
Text(product.name ?? "wat")
}
}
}
}
Оригинал Button
не будет играть с NavigationLink
, но вы можете просто применить выбор к onAppear
в ViewDetail
struct ViewDetail: View {
@ObservedObject var product: Product
@Binding var refresh: Bool
var body: some View {
VStack {
Text("Hello, World!")
Text("Product is \(product.name ?? "wat")")
}
.onAppear {
SelectionHandler().selectProduct(self.product)
}
}
}