更新领域对象更改的视图



我正在更新我的Realm数据库中的对象,但我很难让它重新加载我的任何视图。realm是realm的包装器。它和ActiveManager都工作正常,因为我可以在Realm Studio中查看结果并看到它们更新。在项目屏幕上切换活动后返回项目屏幕时,我如何触发刷新?是否有任何方式只是添加某种观察者到应用程序入口点,以便无论何时Realm数据库因任何原因更改,它都会使所有视图无效并导致处处刷新?我来自typescript/react背景,所以我很难理解swift处理所有这些的方式。下面的代码,为了简洁,我截断了不相关的部分

ManageView

struct ManageView: View {
var body: some View {
NavigationView {
List {
NavigationLink(destination: ItemsView(kind: ITEM_KIND.Area)) {
Text("Areas")
}

NavigationLink(destination: ItemsView(
kind: ITEM_KIND.Scheme
)) {
Text("Schemes")
}

ItemsView

struct ItemsView: View {
@ObservedResults(Active.self) var active
@State var showAddItemModal: Bool = false
var kind: ITEM_KIND
var body: some View {
VStack {
List {
Section("Current") {
ForEach(getCurrent(), id: ._id) { item in
VStack {
NavigationLink(destination: ItemView(item: item)) {
Text("(item.title)")
}
}
}
...
func getCurrent() -> Results<Item> {
let currentPeriod = R.realm.getByKey(Period.self, key: ActiveManager.shared.getPeriod())!
return R.realm.getWhere(Item.self) { item in item.kind == self.kind && item._id.in(currentPeriod.items) }
}

ItemView

struct ItemView: View {
@ObservedRealmObject var item: Item
@State var isActive: Bool = false

func viewWillAppear() {
print("appear")
isActive = ActiveManager.shared.getItems().contains(item._id)
}
var body: some View {
ScrollView {
VStack {
ZStack {
Toggle("Active", isOn: $isActive)
.padding(.horizontal)
.onChange(of: isActive) { value in
if value {
ActiveManager.shared.addItem(item: item)
} else {
ActiveManager.shared.removeAllItems()
}
}

将回来,并在以后的日期发布一个更彻底的解决方案,但我不能得到Realm的属性包装工作,所以在顶部管理视图中,我创建了一些可观察对象,其中包含与@Published包装的项目数组,然后一些函数更新数组。然后我将这些可观察对象传递给Items View,再传递给Item View。每当我改变我的项目时,我就使用可观察对象上的一个更新数组函数来触发状态刷新。

item.realm != nil 

对我来说是一个很好的解决方案,但是它会抛出一个警告。我在解散一个表单后调用它。

最新更新