parent
8339073039
commit
7c9938e29f
@ -0,0 +1,25 @@ |
|||||||
|
// |
||||||
|
// SimpleListOfThingsView.swift |
||||||
|
// JustOneThingWatch |
||||||
|
// |
||||||
|
// Created by Alan Francis on 10/07/2023. |
||||||
|
// |
||||||
|
|
||||||
|
import SwiftUI |
||||||
|
import CoreData |
||||||
|
|
||||||
|
struct SimpleListOfThingsView: View { |
||||||
|
@Environment(\.managedObjectContext) private var viewContext |
||||||
|
@FetchRequest( |
||||||
|
sortDescriptors: [NSSortDescriptor(keyPath: \PersistentThing.createdAt, ascending: true)], |
||||||
|
animation: .default) |
||||||
|
private var items: FetchedResults<PersistentThing> |
||||||
|
|
||||||
|
var body: some View { |
||||||
|
List { |
||||||
|
ForEach(items) { item in |
||||||
|
Text(item.text ?? "no text") |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,85 @@ |
|||||||
|
// |
||||||
|
// ListOfThingsView.swift |
||||||
|
// JustOneThing |
||||||
|
// |
||||||
|
// Created by Alan Francis on 10/07/2023. |
||||||
|
// |
||||||
|
|
||||||
|
import SwiftUI |
||||||
|
import CoreData |
||||||
|
|
||||||
|
struct ListOfThingsView: View { |
||||||
|
@Environment(\.managedObjectContext) private var viewContext |
||||||
|
|
||||||
|
@FetchRequest( |
||||||
|
sortDescriptors: [NSSortDescriptor(keyPath: \PersistentThing.createdAt, ascending: true)], |
||||||
|
animation: .default) |
||||||
|
private var things: FetchedResults<PersistentThing> |
||||||
|
private let timeFormatter: DateFormatter = { |
||||||
|
let formatter = DateFormatter() |
||||||
|
formatter.dateStyle = .none |
||||||
|
formatter.timeStyle = .medium |
||||||
|
return formatter |
||||||
|
}() |
||||||
|
|
||||||
|
var body: some View { |
||||||
|
NavigationView { |
||||||
|
List { |
||||||
|
ForEach(things) { thing in |
||||||
|
NavigationLink { |
||||||
|
Text(thing.text ?? "no text") |
||||||
|
} label: { |
||||||
|
Text(thing.text ?? "no text") |
||||||
|
} |
||||||
|
} |
||||||
|
.onDelete(perform: deleteItems) |
||||||
|
} |
||||||
|
#if os(iOS) |
||||||
|
.toolbar { |
||||||
|
ToolbarItem(placement: .navigationBarTrailing) { |
||||||
|
EditButton() |
||||||
|
} |
||||||
|
ToolbarItem { |
||||||
|
Button(action: addItem) { |
||||||
|
Label("Add Item", systemImage: "plus") |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
#endif |
||||||
|
Text("Select an item") |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private func addItem() { |
||||||
|
withAnimation { |
||||||
|
let newThing = PersistentThing(context: viewContext) |
||||||
|
newThing.createdAt = Date() |
||||||
|
newThing.uuid = UUID() |
||||||
|
newThing.text = "thing created \(timeFormatter.string(from: Date()))" |
||||||
|
|
||||||
|
do { |
||||||
|
try viewContext.save() |
||||||
|
} catch { |
||||||
|
// Replace this implementation with code to handle the error appropriately. |
||||||
|
// fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. |
||||||
|
let nsError = error as NSError |
||||||
|
fatalError("Unresolved error \(nsError), \(nsError.userInfo)") |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private func deleteItems(offsets: IndexSet) { |
||||||
|
withAnimation { |
||||||
|
offsets.map { things[$0] }.forEach(viewContext.delete) |
||||||
|
|
||||||
|
do { |
||||||
|
try viewContext.save() |
||||||
|
} catch { |
||||||
|
// Replace this implementation with code to handle the error appropriately. |
||||||
|
// fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. |
||||||
|
let nsError = error as NSError |
||||||
|
fatalError("Unresolved error \(nsError), \(nsError.userInfo)") |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue