SwiftUI Core Data Example

195 阅读1分钟

Simulator Screen Shot - iPhone 14 Pro - 2023-03-13 at 01.45.57.png

//

//  ContentView.swift

//  resume_x

//

//  Created by Ryan Andrew on 2023/3/12.

//

  


**import** SwiftUI

**import** CoreData

  


**struct** ContentView: View {

    @Environment(\.managedObjectContext) **private** **var** viewContext

  


    @FetchRequest(

        sortDescriptors: [NSSortDescriptor(keyPath: \Item.timestamp, ascending: **true**)],

        animation: .easeIn)

    **private** **var** items: FetchedResults<Item>

  


    **var** body: **some** View {

        NavigationView {

            List {

                ForEach(items) { item **in**

                    NavigationLink {

                        Text("Item at \(item.timestamp!, formatter: itemFormatter)")

                    } label: {

                        Text(item.timestamp!, formatter: itemFormatter)

                    }

                }

                .onDelete(perform: deleteItems)

            }

            .toolbar {

                ToolbarItem(placement: .navigationBarTrailing) {

                    EditButton()

                }

                ToolbarItem {

                    Button(action: addItem) {

                        Label("Add Item", systemImage: "plus")

                    }

                }

            }

            Text("Select an item")

        }

    }

  


    **private** **func** addItem() {

        withAnimation {

            **let** newItem = Item(context: viewContext)

            newItem.timestamp = 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 { items[$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)")

            }

        }

    }

}

  


**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)

    }

}