Here's some base code (slightly modified boiler plate). At the moment, selecting the item just opens the detail view in the right column. I want the sidebar (left column) to slide away as soon as I select an item.
| |
| import CoreData |
| |
| |
| |
| struct DetailView: View { |
| |
| @Environment(\.managedObjectContext) private var viewContext |
| |
| @ObservedObject var item: Item |
| |
| |
| |
| func save() { |
| |
| do { |
| |
| try viewContext.save() |
| |
| |
| |
| } catch { |
| |
| var nserror = error as NSError |
| |
| fatalError("Unresolved error: \(nserror)") |
| |
| } |
| |
| } |
| |
| |
| |
| var body: some View { |
| |
| |
| |
| Text("Item timestamp: \(item.timestamp!)") |
| |
| Button(action: { |
| |
| |
| |
| item.setElement(data: item.values!, row: 0, col: 2, val: item.getElement(data: item.values!, row: 0, col: 2) + 1) |
| |
| save() |
| |
| }) { |
| |
| Text("Add one") |
| |
| } |
| |
| } |
| |
| } |
| |
| |
| |
| struct ContentView: View { |
| |
| @Environment(\.managedObjectContext) private var viewContext |
| |
| |
| |
| @FetchRequest( |
| |
| sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: true)], |
| |
| animation: .default) |
| |
| private var items: FetchedResults<Item> |
| |
| |
| |
| var body: some View { |
| |
| NavigationView { |
| |
| List { |
| |
| ForEach(items) { item in |
| |
| NavigationLink(destination: DetailView(item: item)) { |
| |
| Text("Item at \(item.timestamp!, formatter: itemFormatter)") |
| |
| } |
| |
| } |
| |
| .onDelete(perform: deleteItems) |
| |
| } |
| |
| .toolbar { |
| |
| #if os(iOS) |
| |
| ToolbarItem(placement: .bottomBar) { |
| |
| EditButton() |
| |
| } |
| |
| #endif |
| |
| ToolbarItem(placement: .primaryAction) { |
| |
| Button(action: addItem) { |
| |
| Label("Add Item", systemImage: "plus") |
| |
| } |
| |
| } |
| |
| } |
| |
| } |
| |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| private func addItem() { |
| |
| withAnimation { |
| |
| let newItem = Item(context: viewContext) |
| |
| newItem.timestamp = Date() |
| |
| do { |
| |
| try viewContext.save() |
| |
| } catch { |
| |
| |
| |
| |
| |
| let nsError = error as NSError |
| |
| fatalError("Unresolved error \(nsError), \(nsError.userInfo)") |
| |
| } |
| |
| } |
| |
| } |
| |
| |
| |
| private func deleteItems(offsets: IndexSet) { |
| |
| withAnimation { |
| |
| offsets.map { items[$0] }.forEach(viewContext.delete) |
| |
| |
| |
| do { |
| |
| try viewContext.save() |
| |
| } catch { |
| |
| |
| |
| |
| |
| let nsError = error as NSError |
| |
| fatalError("Unresolved error \(nsError), \(nsError.userInfo)") |
| |
| } |
| |
| } |
| |
| } |
| |
| } |
| |
| |
| |
| private let itemFormatter: DateFormatter = { |
| |
| let formatter = DateFormatter() |
| |
| formatter.dateStyle = .short |
| |
| formatter.timeStyle = .medium |
| |
| return formatter |
| |
| }() |
| |
| |
| |
| struct ContentView_Previews: PreviewProvider { |
| |
| static var previews: some View { |
| |
| ContentView().environment(\.managedObjectContext, PersistenceController.preview.container.viewContext) |
| |
| } |
| |
| } |