swift - 从核心数据中删除/添加到核心数据后,带有列表的 SwiftUI TabView 不刷新
问题描述
描述:
当从上下文中删除列表中的对象(从 fetchrequest 创建)并保存上下文时,列表不会正确更新。
错误:
线程 1:致命错误:在展开可选值时意外发现 nil(在下面的第 5 行抛出)
struct DetailView: View {
@ObservedObject var event: Event
var body: some View {
Text("\(event.timestamp!, formatter: dateFormatter)")
.navigationBarTitle(Text("Detail"))
}
}
重现步骤:
使用 SwiftUI 和 Core Data 创建一个新的 Master Detail App 项目。
在 ContentView 中,将 body 设置为 TabView,第一个选项卡是预构建的 NavigationView,然后添加第二个任意选项卡。
struct ContentView: View {
@Environment(\.managedObjectContext)
var viewContext
var body: some View {
TabView {
NavigationView {
MasterView()
.navigationBarTitle(Text("Master"))
.navigationBarItems(
leading: EditButton(),
trailing: Button(
action: {
withAnimation { Event.create(in: self.viewContext) }
}
) {
Image(systemName: "plus")
}
)
Text("Detail view content goes here")
.navigationBarTitle(Text("Detail"))
}
.navigationViewStyle(DoubleColumnNavigationViewStyle())
.tabItem { Text("Main") }
Text("Other Tab")
.tabItem { Text("Other Tab") }
}
}
}
- 添加一些项目。以任何方式与这些项目互动。
- 更改选项卡。
- 改回主选项卡。
- 尝试删除项目。
解决方案
我找到了一个纯 SwiftUI 工作解决方案:
/// This View that init the content view when selection match tag.
struct SyncView<Content: View>: View {
@Binding var selection: Int
var tag: Int
var content: () -> Content
@ViewBuilder
var body: some View {
if selection == tag {
content()
} else {
Spacer()
}
}
}
您可以通过以下方式使用它:
struct ContentView: View {
@State private var selection = 0
var body: some View {
TabView(selection: $selection) {
SyncView(selection: $selection, tag: 0) {
ViewThatNeedsRefresh()
}
.tabItem { Text("First") }
.tag(0)
Text("Second View")
.font(.title)
.tabItem { Text("Second") }
.tag(1)
}
}
}
您可以对需要刷新的每个视图使用 SyncView。
推荐阅读
- python - 一个字符串到上和下
- c# - 如何使用 C# 解密实体框架中的数据,在 SQL Server 中使用对称密钥和证书加密?
- time-series - 访问 Axon 中的所有(历史)事件
- ios - CloudKit 通知的动态 alertBody
- python - 在 django 中进行高级搜索的正确方法
- eclipse - 如何在 Eclipse 中禁用/不显示向导?
- reactjs - 在 React Native 中呈现逗号分隔的值字符串
- java - Android Studio - 如何将数据从 MainActivity.xml 发送到服务?
- reactjs - Django/React 部署仅在我设置 DEBUG=True & STATICFILES_DIRS 而不是列表时才有效
- qt - 获取所选项目的 QML 模型