SwiftUI @fetchrequest未更新我的视图

时间:2020-03-11 19:34:38

标签: fetch swiftui fetchrequest

我有一个使用@fetchrequest包装器从CoreData插入的视图,但是它工作正常,但是当我在.sheet中编辑数据并返回该视图时,直到我导航离开并回来。它不应该自动更新吗?这是一些示例代码:

列表

import CoreData
struct Stories: View {
    @State var addStory = false
    @Environment(\.managedObjectContext) var moc
    @FetchRequest<Story>(
        entity: Story.entity(),
        sortDescriptors: []
    ) var stories: FetchedResults<Story>

    var body: some View {
        ScrollView(.vertical, showsIndicators: false) {

        ForEach(stories, id: \.self){ story in

                 GeometryReader { geometry in   
                            StoryCard(show: story.show,
                                    image: Image(uiImage: UIImage(data: story.image as! Data)!) ?? Image("deer3"),
                                title: story.title,
                                date:story.date,
                                locationTitle: story.locationTitle ?? "",
                                text: story.text,
                                    timeOfDay: timeOfDayData[Int(story.tod)],
                                weather: weatherData[Int(story.weather)],
                                story: story)
                            .environment(\.managedObjectContext, self.moc)
                            .offset(y: story.show ? -geometry.frame(in: .global).minY : 0)

                 }.frame(height: story.show ? screen.height : 280)
                        .frame(maxWidth:story.show ? .infinity : screen.width-60)
                        .background(Color("Tan"))
                    .zIndex(story.show ? 2.0 : 0.5)

                }
            }

        }

对象

struct StoryCard: View {  

@State var show:Bool
@State var image:Image = Image("deer1")
@State var title = "Story title"
@State var date:Date = Date()
@State var locationTitle = "Priddis"
@State var location:CLLocationCoordinate2D = CLLocationCoordinate2D()
@State var text = "Lorem ipsum valor decor vassus sit amet."
@State var timeOfDay = timeOfDayData[0]
@State var weather = weatherData[0]
@State var edit = false

@ObservedObject var story:Story

@Environment(\.managedObjectContext) var moc

var body: some View {

....

Button(action:{
self.show.toggle()
self.moc.performAndWait {
self.story.show = self.show
try? self.moc.save()
}
self.edit.toggle()
}){
Text("Edit")
}.sheet(isPresented: self.$edit) {
 ImagePickerTest(addStory: self.$edit, story:self.story).environment(\.managedObjectContext, self.moc)
}

....
}
}

编辑

struct Editor: View{
...
@State var story:Story?
@Environment(\.managedObjectContext) var moc

 var body: some View {
...
Button(action:{
self.moc.performAndWait {
   self.story!.title = self.storyName
   self.story!.date = self.date
   self.story!.locationTitle = self.locationTitle
   self.story!.tod = Int16(self.tod)
   self.story!.weather = Int16(self.weather)
   self.story!.text = self.text
   self.story!.show = false
   self.story!.latitude = self.centerCoordinate.latitude
   self.story!.longitude = self.centerCoordinate.longitude
   self.story!.image = self.inputImage?.pngData()

   try? self.moc.save()

}){
Text("Save")
}
...

}

}

任何帮助将不胜感激。谢谢!

1 个答案:

答案 0 :(得分:0)

对于任何有兴趣的人,我实际上都知道了。我正在将单个变量传递到我的Story对象中,而不是使用@observedobject story变量(Picard facepalm)中的变量