显示带有来自 Core Data 的布尔值的 .sheet

Posted

技术标签:

【中文标题】显示带有来自 Core Data 的布尔值的 .sheet【英文标题】:Show a .sheet with a bool from Core Data 【发布时间】:2019-12-14 13:34:20 【问题描述】:

我有一张显示我的应用指南的工作表。 工作表由本地布尔显示指南呈现。 我希望本地 bool 使用 bool showGuide 在我的设置实体中镜像 Core Data 中的 bool

我通常知道如何保存和检索 bool 的状态,但在应用启动时检索核心数据中的 bool 是我遇到的问题。

当用户点击“知道了!”按钮时我希望指南不再显示。 (也许我可以在设置视图中设置一个按钮,如果他们需要复习,可以再次激活它)

我尝试使用测试视图的自定义初始化程序来尝试检索 settings.showGuide 但没有运气。

我也知道设置是一个数组,所以我必须始终保存并检索到设置数组中的第一项。有没有更简单的方法来做到这一点?保存一个实体而不是数组?

有什么想法吗?

import Foundation
import SwiftUI
import CoreData


struct Test: View 

    @Environment(\.managedObjectContext) var managedObjectContext
    @FetchRequest(fetchRequest: Settings.getSettings()) var settings:FetchedResults<Settings>

    @State private var showingGuide = true

    var body: some View

        VStack
            Text("Hello")
        
        .sheet(isPresented: $showingGuide) 

            MainGuide().padding(.horizontal)

            Button(action: 
                let settings = Settings(context: self.managedObjectContext)
                settings.showGuide = false
                self.showingGuide = false
                do 
                    try self.managedObjectContext.save()
                catch
                    print(error)
                
            )
                Text("Got it!")

            .padding()
        
    



【问题讨论】:

【参考方案1】:

您不应该以编程方式设置 @State 变量 (link)。相反,使用 if-statement 取决于来自 CoreData-object 的布尔值来显示工作表与否。

我还建议为设置对象添加一个计算变量,因为它始终是数组中的第一个元素,如下面的 var settings 代码所示。

你可以这样做:

struct ContentView: View 

    @Environment(\.managedObjectContext) var managedObjectContext

    @FetchRequest(
        entity: Settings.entity(),
        sortDescriptors: [
            NSSortDescriptor(keyPath: \Settings.self, ascending: false)
        ]
    ) var settingsRequest: FetchedResults<Settings>

    var settings:Settings
        settingsRequest[0]
    

    @State var showGuide:Bool = true

    var body: some View
        VStack
            if settings.showSheet
                Text("show sheet: \(String(settings.showSheet))").sheet(isPresented: $showGuide)
                    Text("Hello from Sheet")
                    Button(action: 
                        self.settings.showSheet = false
                        self.showGuide = false
                        do 
                            try self.managedObjectContext.save()
                        catch
                            print(error)
                        
                    )
                        Text("Got it!")

                    .padding()
                
            else
                Text("already agreed")
            
        
    

注意:如果用户单击按钮,这只会将 settings.showSheet 设置为 true。通过滑动关闭工作表时,它不会更新 CoreData。如果您想对滑动操作执行一些操作,可以使用.onDismiss(perform: )

【讨论】:

感谢您的回复!是的,我可以轻松地保存视图中按钮单击的核心数据。但是我的问题是在加载 ContentView 时检查设置实体中的布尔值 是的,我遇到了您的问题,这正是代码的作用。仅当设置对象中的布尔值设置为 true 时才会显示工作表。

以上是关于显示带有来自 Core Data 的布尔值的 .sheet的主要内容,如果未能解决你的问题,请参考以下文章

使用带有布尔值的 Qsettings 迭代设置字典

错误:使用带有布尔值的 BLoC_pattern 时出现“错误状态:无元素”

在单个 NSTableView (Core-Data) 中显示来自多个实体的数据

程序接收信号:带有Core Data的“EXC_BAD_ACCESS”

Core Data 布尔属性比较

如何防止备份带有外部文件的 Core Data 数据库?