首页 > 解决方案 > Core Data - 数据传输 SwiftUI

问题描述

我正在尝试将 CDListModel 转移到我的今日视图,但我无法正确完成。这样我就可以在 list.reminders.count 中查看我今天总共有多少提醒。现在我得到0

    struct Today: View {
    @Environment(\.managedObjectContext) private var viewContext
    @ObservedObject var list: CDListModel
    @State var isTodayTapped = false
    var body: some View {
        Button(action: {
            self.isTodayTapped.toggle()
        }) {
            ZStack{
                RoundedRectangle(cornerRadius: 15)
                    .foregroundColor(.white)
                HStack(alignment: .top, spacing: 100) {
                    Text(String(list.reminders!.count))
                }
            }
        }
        .fullScreenCover(isPresented: $isTodayTapped) {
            TodayView()
        }
    }
}

主页视图

    struct MainPageView: View {
    @Environment(\.managedObjectContext) private var viewContext
    var list: CDListModel
    var body: some View {
        ZStack {
            NavigationView {
                ZStack {
                    VStack{
                        HStack(spacing: 20){
                            Today(list: list) //What should I send here?
                                .environment(\.managedObjectContext, viewContext)
                        }
                    }
                }
            }
        }
    }
}

内容视图

 struct ContentView: View {
    @Environment(\.managedObjectContext) private var viewContext

    @State var selectedList = ListModel(color: "", text: "", reminders: [])
   
    var body: some View {
         MainPageView(selectedList: $selectedList, list: CDListModel())
            .environment(\.managedObjectContext, viewContext)
    }
}

标签: core-dataswiftui

解决方案


您不需要将数据从另一个视图传输到今天视图。因为您需要的数据已经在核心数据中,所以您可以使用

@FetchRequest( entity: CDReminder.entity(),
                   sortDescriptors:
                    [NSSortDescriptor(keyPath: \CDReminder.date, ascending: true)]
    )var reminder: FetchedResults<CDReminder>

在 Today 视图中,无需修改任何其他视图。

今天更改如下

struct Today: View {
    @Environment(\.managedObjectContext) private var viewContext
    @FetchRequest( entity: CDReminder.entity(),
                   sortDescriptors:
                    [NSSortDescriptor(keyPath: \CDReminder.date, ascending: true)]
    )var reminder: FetchedResults<CDReminder>

    @State var isTodayTapped = false
    var body: some View {
        Button(action: {
            self.isTodayTapped.toggle()
        }) {
            ZStack{
                RoundedRectangle(cornerRadius: 15)
                    .foregroundColor(.white)
                HStack(alignment: .top, spacing: 100) {
                    Text(String(list.reminders!.count))
                }
            }
        }
        .fullScreenCover(isPresented: $isTodayTapped) {
            TodayView()
        }
    }
}

主页如下

struct MainPageView: View {
    @Environment(\.managedObjectContext) private var viewContext
    var body: some View {
        ZStack {
            NavigationView {
                ZStack {
                    VStack{
                        HStack(spacing: 20){
                            Today()
                                .environment(\.managedObjectContext, viewContext)
                        }
                    }
                }
            }
        }
    }
}

内容视图如下

struct ContentView: View {
    @Environment(\.managedObjectContext) private var viewContext

    @State var selectedList = ListModel(color: "", text: "", reminders: [])
   
    var body: some View {
        MainPageView(selectedList: $selectedList)
            .environment(\.managedObjectContext, viewContext)
    }
}

推荐阅读