首页 > 解决方案 > 核心数据 NSManagedObject - ObservedObjects 未更新

问题描述

我有一个数据输入视图,可让用户添加图像并在这样做后查看预览。

ImagePickerView返回了一个我通过转换器UIImage保存到核心数据的类型。但是,选择图像后,即使我正在使用,视图也不会更新以显示它Data.pngData@ObservedObjectobjectWillChange

我不能使用@State,因为草稿对象是NSManagedObject

import SwiftUI
import CoreData

struct AddItemView: View {
    @Environment(\.managedObjectContext) var moc
    @Environment (\.presentationMode) var presentationMode
    
    @State var showImagePicker: Bool = false
    
    @ObservedObject var draft: Item    //Core Data entity
                        
    var body: some View {
        
        NavigationView {
            VStack {
                if (draft.image != nil) {
                    Image(uiImage: UIImage(data: draft.image!)!)
                        .resizable()
                        .aspectRatio(contentMode: .fit)
                        .frame(width: UIScreen.main.bounds.width - 32, height: UIScreen.main.bounds.height / 4)
                        .clipShape(RoundedRectangle(cornerRadius: 20))
                } else {
                    Button(action: {
                        self.showImagePicker = true
                    }, label: {
                        RoundedRectangle(cornerRadius: 20)
                    })
                    .padding([.all], 20)
                }

            }
            .sheet(isPresented: $showImagePicker) {
                ImagePickerView(sourceType: .photoLibrary) { image in
                    draft.objectWillChange.send()
                    draft.image = image.pngData()
                }
            }

            
        }
    }
}

标签: iosswiftcore-dataswiftui

解决方案


进行更改objectWillChange.send() 尝试使用:

.sheet(isPresented: $showImagePicker) {
    ImagePickerView(sourceType: .photoLibrary) { image in
        draft.image = image.pngData() // #1
        draft.objectWillChange.send() // #2
    }
}

推荐阅读