swift - 在 SwiftUI 中创建和编辑的视图相同
问题描述
几天以来,我试图找到一种解决方案,在 SwiftUI 中使用相同的视图创建和编辑 CoreData 对象。
假设我们有一个名为 的 CoreData 实体Entry
。它只有一个属性name: String
现在我们有一个包含所有Entry
对象列表的主/主视图。要导航到 DetailView,我使用以下代码:
List {
ForEach(entires) { entry in
NavigationLink(destination: DetailView(entry: entry)) {
Text(item.name ?? "empty")
}
}
}
在这个 DetailView 中,我可以编辑现有对象:
struct DetailView: View {
@Environment(\.presentationMode) var presentationMode
@Environment(\.managedObjectContext) private var viewContext
@State var name: String = ""
@ObservedObject var entry: Entry
init(entry: Entry) {
self.entry = entry
self._name = State(initialValue: entry.name ?? "")
}
var body: some View {
NavigationView {
Form {
Section {
TextField("Name", text: $name)
Button("Save") {
guard name != "" else {return}
entry.name = name
do {
try viewContext.save()
print("saved")
} catch {
print(error.localizedDescription)
}
presentationMode.wrappedValue.dismiss()
}
}
Button("Cancel") {
presentationMode.wrappedValue.dismiss()
}.accentColor(.red)
}
.navigationTitle("Entry Name")
}
}
}
但是我需要一个不同的视图,它对于新条目看起来完全一样,因为这个视图不需要@ObservedObject
. 我通过主/主视图中的简单添加按钮访问此视图,它看起来像这样:
struct AddView: View {
@Environment(\.presentationMode) var presentationMode
@Environment(\.managedObjectContext) private var viewContext
@State var name: String = ""
var body: some View {
NavigationView {
Form {
TextField("Name", text: $name)
Button("Save") {
guard name != "" else {return}
let entry = Entry(context: viewContext)
entry.name = name
do {
try viewContext.save()
print("saved")
} catch {
print(error.localizedDescription)
}
presentationMode.wrappedValue.dismiss()
}
Button("Cancel") {
presentationMode.wrappedValue.dismiss()
}.accentColor(.red)
}
.navigationTitle("Add new Entry")
}
}
}
我在这里不喜欢的是我有两个 99% 相等的视图,除了一个有@ObservedObject
,另一个没有。如何将这两个视图合并为一个?我需要的是一个@ObservedObject var entry: Entry?
我可以保持条目可选的地方。
解决方案
推荐阅读
- javascript - NodeJS 如何处理循环中相同函数的并行执行?
- javascript - 如何在未选中的单选按钮旁边获取输入文本值?
- javascript - 我有一个 Uncaught TypeError: Cannot set property 'value' of null 错误
- reactive-programming - Project Reactor 的 or() 运算符使用问题
- mysql - 用户在同一天的 30 分钟内执行的最大连续操作数
- solr - 简单的 solr 查询不起作用 - 我错过了什么?
- javascript - 解决 fetch 承诺以获取内部价值
- flutter - Flutter 和 Angular Dart 都共享组件模式,但是这两个框架之间的一个根本区别是什么?
- django - 获取聚合中Max记录的ID
- python - 我们可以使用列表推导来初始化嵌套列表吗?