SwiftUI之简单CoreData使用后续

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()
    }
}

猜你喜欢

转载自blog.csdn.net/jackwsd/article/details/107033585