• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • SwiftUI之簡單CoreData使用后續

    標簽: swift

    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()
        }
    }
    
    版權聲明:本文為jackwsd原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/jackwsd/article/details/107033585

    智能推薦

    iOS:CoreData使用

    說明: CoreData是數據庫框架,封裝了原始的SQLite操作,直接操作對象就可以完成增刪改查。   一、建立CoreData數據表與對應的數據對象: 1.在創建iOS工程時,在輸工程名稱與包名的窗口,選中"Use Core Data",如圖所示: 2.在打開的工程目錄中選中"工程名.xcdatamodeId",在中間視圖窗口點底部"...

    使用CoreData [4]

    使用CoreData [4] 此片文章主要是分析如何對CoreData進行封裝. 在開始之前,我們需要弄明白3個非常關鍵的類,以下翻譯湊合著看看.   NSManagedObjectContext An instance of NSManagedObjectContext represents a single “object space” or scratch ...

    XMPP框架 微信項目開發之CoreData學習——使用CoreData建立多個數據庫

    當工程很大,涉及多個功能模塊時。往往需要使用到多個數據庫。當CoreData框架開發具有多個模塊的工程時,也需要建立多個數據庫,具體方法如下: 第一步:新建實體模板,一般一個功能模塊對應一個數據庫,一個實體模板對應一個上下文對象。即需要將一個功能模塊所涉及的所有實體都新建在一個對應的實體模板。對應關系:一個功能模塊——>一個實體模板——>...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    猜你喜歡

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    精品国产乱码久久久久久蜜桃不卡