【问题标题】:Show a .sheet with a bool from Core Data显示带有来自 Core Data 的布尔值的 .sheet
【发布时间】: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()
        }
    }


}

【问题讨论】:

    标签: swiftui


    【解决方案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 时才会显示工作表。
    猜你喜欢
    • 2018-09-03
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-10
    • 2018-01-20
    • 2019-04-19
    • 1970-01-01
    相关资源
    最近更新 更多