如何在 SwiftUI 视图中更新核心数据信息

Posted

技术标签:

【中文标题】如何在 SwiftUI 视图中更新核心数据信息【英文标题】:How to update core data info in a SwiftUI view 【发布时间】:2020-06-24 22:23:25 【问题描述】:

我陷入了僵局。我想显示要编辑的 CoreData 中的数据,然后将其更新回数据库。似乎没有任何方法可以做到这一点,但这是一个如此基本的操作,我确定问题出在我的最后。

这是我的代码

import SwiftUI
import CoreData

struct CustomerEditView: View

    @Environment(\.managedObjectContext) var context
    
    @State var firstName = ""
    @State var lastName = ""
    @State var phone = ""
    @State var email = ""
    @State var birthday = ""
    
    var customer: Customer
    
    var body: some View
    
        //firstName = customer.firstName!
        //lastName = customer.lastName!
        //phone = customer.phone!
        //email = customer.email!
        
        return VStack
        
        TextField("First Name", text: $firstName)
        TextField("Last Name", text: $lastName)
        TextField("Cell Phone", text: $phone)
        TextField("EMail", text: $email)
        TextField("Birthday", text: $birthday)
        Button("Save")
        
            do
                    
                        //customer.birthday = self.birthday
                        customer.firstName = firstName
                        customer.lastName = lastName
                        customer.phone = phone
                        customer.email = email
                        try context.save()
                    
            catch
            
                print(error.localizedDescription)
            
            
        
        
    

我尝试了多种方法从 CoreData Customer 实体更新状态变量,但在 SwiftUI 中似乎没有任何方法可以在不触发有关在更新操作期间修改状态值的警告的情况下执行此操作。我会接受任何解决方案,但似乎应该有一种方法可以实现这一点,而无需使用临时状态变量,只需引用核心数据属性。

【问题讨论】:

【参考方案1】:

这是一条路

struct CustomerEditView: View

    @Environment(\.managedObjectContext) var context
    
    @State var firstName: String    // << declare only

    // ... other states are the same
    
    var customer: Customer

    init(customer: Customer) 
        self.customer = customer

        // create state with initial value from customer
        _firstName = State(initialValue: customer.firstName ?? "")   // << here !!
        
        // ... other states are the same
    
    
    var body: some View
    
        // .. other your code

【讨论】:

我看了很多次,但找不到下划线(在这种情况下)的定义位置。前段时间看到有引用,但是找不到了。 @Russ,它是 State 属性包装器的名称。它由编译器自动生成。 感谢您提供此答案,它也对我有用。而且,更新数据的方式真是太糟糕了。不知道开发人员如何自己解决这个问题。

以上是关于如何在 SwiftUI 视图中更新核心数据信息的主要内容,如果未能解决你的问题,请参考以下文章

Swiftui @EnvironmentObject 在视图中更新

如何使用 swiftui 将文本字段存储到核心数据中

如何正确处理更新视图中的选取器(SwiftUI)

如何使用核心数据将对象传递给 SwiftUI 中的其他视图

如何在视图启动之前在 SwiftUI 中加载更新的变量?

值更改时如何在 UIKit 中更新 SwiftUI 视图?