【问题标题】:How to cancel a change made to a projectedValue如何取消对projectedValue 所做的更改
【发布时间】:2021-07-06 11:50:12
【问题描述】:

所以我有一个允许用户更新CoreData 属性的视图。

然后他们可以选择取消保存

TextFieldCoreData 类的 projectedValue 链接

TextField("New Value", text: $coreDataClass.value)

CoreData 已经与 Combine 链接非常好,这样我们就可以附加 $ 来获得双向绑定功能。然而,在这个特定的视图上给我带来了一些问题,因为如果用户在插入 any 值后点击取消,那么即使在视图被关闭后该值仍然存在。

如果用户点击取消,我将如何取消更改...我认为使用 lazy var 将是完美的,因为它只读取一次但不起作用。我曾想过使用一个类来捕获初始值,然后在 cancel 方法中使用它,但这也没有用。

我们将不胜感激任何有关该问题的指导!

在评论中回答问题 不相关

import SwiftUI

extension Text {
    func buttonView(type: ButtonType) -> some View {
        
        func selectColor(type: ButtonType) -> Color {
            switch type {
            case .default:
                return .blue
            case .destructive:
                return .red
            case .utility:
                return .purple
            }
        }

       return self.bold()
            .foregroundColor(.white)
            .padding(.horizontal)
            .padding(.vertical, 5)
            .background(selectColor(type: type))
            .cornerRadius(8)
        
    }
}

enum ButtonType {
    case `default`
    case destructive
    case utility
}

【问题讨论】:

  • 你必须更新一些本地 @State 属性作为临时存储,并在 save 上将其分配给核心数据
  • 您应该在与 Core Data 交互的位置显示您的代码。 Core Data 只会在您提交更改时保存更改。
  • 一个附带问题,我喜欢您的按钮尺寸,您使用的是自定义尺寸还是有用于此按钮的标准尺寸,颜色和字体也一样?
  • @swiftPunk 它是 Text 的扩展,唯一的技巧是填充。给它 .padding(.horizo​​ntal) 和 .padding(.vertical, 8) 只是限制垂直缓冲
  • @swiftPunk 我在主要问题中发布了完整代码,请参阅原始帖子,我认为有一种方法可以更好地编码垂直填充而不是硬编码,但也没有玩过很多

标签: ios core-data swiftui


【解决方案1】:

您可能知道,当您编辑 CoreData 字段时,它不会被保存到数据库中,直到您运行 viewContext.save()

如果您需要恢复更改,还有另一个:viewContext.rollback()

但请注意,它会丢弃自上次保存以来对所有对象所做的所有更改。因此,如果您有许多更改并且只想丢弃一个,则需要手动执行:在初始化中使用对象字段中的值填充 @State 值,然后在 Save 中将 @State 写入您的对象字段。

【讨论】:

    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2022-11-18
    • 2012-12-08
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多