【发布时间】:2021-07-06 11:50:12
【问题描述】:
所以我有一个允许用户更新CoreData 属性的视图。
然后他们可以选择取消或保存
TextField 与 CoreData 类的 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(.horizontal) 和 .padding(.vertical, 8) 只是限制垂直缓冲
-
@swiftPunk 我在主要问题中发布了完整代码,请参阅原始帖子,我认为有一种方法可以更好地编码垂直填充而不是硬编码,但也没有玩过很多