显示带有来自 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的主要内容,如果未能解决你的问题,请参考以下文章
错误:使用带有布尔值的 BLoC_pattern 时出现“错误状态:无元素”
在单个 NSTableView (Core-Data) 中显示来自多个实体的数据