Swiftui 显示包含核心数据bool的.sheet
我有一张显示我的应用程序指南的表格。 这张表由当地的图书展示指南提供。 我希望本地bool使用bool showGuide在我的设置实体中镜像核心数据中的bool 一般来说,我知道如何保存和检索bool的状态,但在应用程序启动时检索核心数据中的bool是我遇到的难题 当用户点击按钮“明白了!”我希望导游再也不来了。(也许我可以在设置视图中设置一个按钮,如果他们需要刷新,可以再次激活该按钮) 我尝试过使用测试视图的自定义初始化器,该初始化器尝试检索settings.showGuide,但没有成功 我也知道设置是一个数组,所以我必须始终保存并检索设置数组中的第一项。有没有更简单的方法?是否保存一个实体而不是数组 有什么想法吗Swiftui 显示包含核心数据bool的.sheet,swiftui,Swiftui,我有一张显示我的应用程序指南的表格。 这张表由当地的图书展示指南提供。 我希望本地bool使用bool showGuide在我的设置实体中镜像核心数据中的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()
}
}
}
<代码>导入基础
导入快捷键
导入CoreData
结构测试:视图{
@环境(\.managedObjectContext)变量managedObjectContext
@FetchRequest(FetchRequest:Settings.getSettings())变量设置:FetchedResults
@国家私有var showingGuide=true
var body:一些观点{
VStack{
文本(“你好”)
}
.表(显示:$showingGuide){
MainGuide().填充(.卧式)
按钮(操作:{
let settings=settings(上下文:self.managedObjectContext)
settings.showGuide=false
self.showingGuide=false
做{
请尝试self.managedObjectContext.save()
}抓住{
打印(错误)
}
}){
文本(“明白了!”)
}.padding()
}
}
}
您不应该以编程方式设置
@状态
-变量()。相反,使用取决于CoreData
-对象中的布尔值的if
-语句来显示工作表或不显示工作表
我还建议为settings对象添加一个计算变量,因为它始终是数组中的第一个元素,如下面代码var settings
所示
您可以这样做:
struct ContentView:View{
@环境(\.managedObjectContext)变量managedObjectContext
@获取请求(
实体:设置。实体(),
sortDescriptors:[
NSSortDescriptor(密钥路径:\Settings.self,升序:false)
]
)var设置请求:获取结果
变量设置:设置{
设置请求[0]
}
@状态变量showGuide:Bool=true
var body:一些观点{
VStack{
if settings.showSheet{
文本(“显示工作表:\(字符串(settings.showSheet))”)。工作表(显示:$showGuide){
文本(“来自工作表的您好”)
按钮(操作:{
self.settings.showSheet=false
self.showGuide=false
做{
请尝试self.managedObjectContext.save()
}抓住{
打印(错误)
}
}){
文本(“明白了!”)
}.padding()
}
}否则{
案文(“已商定”)
}
}
}
}
注意:这将仅在用户单击按钮时将设置设置设置为true。通过滑动解除工作表时,它不会更新CoreData。如果您想对刷卡操作执行某些操作,可以使用
.onDismiss(perform:{})
谢谢您的回复!是的,我可以在视图中单击按钮时轻松保存核心数据。但我的问题是在加载ContentView时检查设置实体中的bool是的,我有你的问题,这正是代码所做的。仅当设置对象中的布尔值设置为true时,才会显示工作表。