CoreData使用后续
在之前的基础上增加对已经录入的内容的修改。新建SwiftUI文件,命名为EditListToDo.swift。
内容如下(简单注释):
import SwiftUI
import CoreData
struct EditListToDo: View {
@Environment(\.managedObjectContext) var managedObjectContext
@Environment(\.presentationMode) var presentationMode
//需要传入的变量
var todoItem: ToDoItem
@State var updatedNeedTodo: String = ""
var body: some View {
List{
VStack {
//此处修改内容
TextField("Need to do...", text: $updatedNeedTodo)
.textFieldStyle(RoundedBorderTextFieldStyle())
.onAppear(perform: {
//每次显示该视图时赋值变量
self.updatedNeedTodo = self.todoItem.needToDo ?? ""
})
Button(action: {
self.todoItem.needToDo = self.updatedNeedTodo
do{
try self.managedObjectContext.save()
}catch
{
print(error)
}
//button按下后退出该视图
self.presentationMode.wrappedValue.dismiss()
})
{
Text("确定")
}
}
}
}
}
回到ContentView中,找到最外层 List,在其外部加上NavigationView,这样点击需要修改的内容时,可以使用NavigationLink进入下级视图。
NavigationView
{
List
HStack {
self.image(for: item.showFlag).onTapGesture {
item.showFlag.toggle()
do{
try self.managedObjectContext.save()
}catch{
print(error)
}
}
NavigationLink(destination: EditListToDo(todoItem: item))
{
Text("\(item.needToDo ?? "")")
}
}
点击“要做的事”下面的“Erwerad…”进入下级视图,并且修改内容
要删除“要做的事”列表内容,在ForEach后引入Modifier,如图
然后针对特定的内容左滑手指,则可选择删除。
再为navigationView添加title,以及右上角添加Edit按钮,可以通过选择按钮删除内容。
这两个modifier虽然是针对navigationView的,但是其必须放在navigationView内,而不是外部。
至此,非常简单的清单小程序就完成了。
ContentView.swift代码
import SwiftUI
import CoreData
struct ContentView: View {
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(fetchRequest: ToDoItem.allneedToDoFetchRequest()) var toDoItems: FetchedResults<ToDoItem>
@State private var thingsToDo = ""
@State private var showFinishedFlag = false
func image(for state: Bool) -> Image {
return state ? Image(systemName: "checkmark.circle") : Image(systemName: "circle")
}
var body: some View {
NavigationView
{
List
{
Section(header: Text("写点啥"))
{
HStack {
TextField("待办?", text: $thingsToDo)
//.frame(width: 100, height: 100)
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)
{
item in
HStack {
self.image(for: item.showFlag).onTapGesture {
item.showFlag.toggle()
do
{
try self.managedObjectContext.save()
}catch
{
print(error)
}
}
NavigationLink(destination: EditListToDo(todoItem: item))
{
Text("\(item.needToDo ?? "")")
}
}
}.onDelete { (indexSet) in
let itemToDelete = self.toDoItems[indexSet.first!]
self.managedObjectContext.delete(itemToDelete)
do {
try self.managedObjectContext.save()
} catch {
print(error)
}
}
}
}
.navigationBarTitle("待办清单")
.navigationBarItems(trailing: EditButton())
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}