使用自带CoreData进行数据存储
1.创建新的SwiftUI工程,名字取为What to do,创建的时候在User Core Data前打勾☑️。
这样就在AppDelegate.swift中则自动添加了两个函数,用于处理coredata,不再需要手动添加了(What拼错了,懒得改了)。
2.找到WhatToDo.xcdataModeld文件,点击Add Entity,添加新的Entity,命名为"ToDoItem"。在Attribute中添加两个变量,needToDo 类型为String,ShowFlag 类型为Boolean。因为这个小程序只有很简单的添加内容以及完成与否显示功能,所以变量很少。
3.现在可以进入ContentView.swift编程首先定义coredata数据相关的内容,用于处理coredata
操作变量toDoItem即操作本工程中读取后的coredata,并按needToDo中字符串升序排列好的。
定义两个变量,对应ToDoItem中变量
@State private var thingsToDo = ""
@State private var showFinishedFlag = false
定义一个图片处理函数
//判断是否显示checkmark
func image(for state: Bool) -> Image {
return state ? Image(systemName: "checkmark.circle") : Image(systemName: "circle")
}
显示文本输入框,以及确认Button。当文本输入完成后,点击Button后存储到CoreData数据中。
HStack {
TextField("待办?", text: $thingsToDo)
Button(action: {
let newThing = ToDoItem(context: self.managedObjectContext)
newThing.needToDo = self.thingsToDo
newThing.showFlag = false
do
{
try self.managedObjectContext.save()
}catch
{
print(error)
}
self.thingsToDo = ""
})
{
Text("✓")
.font(.headline)
}
}
模拟器显示
每次点击蓝色☑️的时候,存储CoreData数据,清除TextField中信息。
4.完善显示
加入List与Section将待输入内容与已经输入好的分开显示
List
{
//待输入
Section(header: Text("写点啥"))
{
HStack {
TextField("待办?", text: $thingsToDo)
Button(action: {
let newThing = ToDoItem(context: self.managedObjectContext)
newThing.needToDo = self.thingsToDo
newThing.showFlag = false
do
{
try self.managedObjectContext.save()
}catch
{
print(error)
}
self.thingsToDo = ""
})
{
Text("✓")
.font(.headline)
}
}
}
//显示已经输入完成的内容
Section(header: Text("要做的事"))
{
ForEach(toDoItems, id: \.self)
{
item in
HStack {
self.image(for: item.showFlag).onTapGesture {
item.showFlag.toggle()
do
{
try self.managedObjectContext.save()
}catch
{
print(error)
}
}
}
}
}
}
模拟器
基本完成。后续加入对已经录入内容修改页面,以及删除已录入内容。