微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI - 视图仅在其自身修改时更新,而不是从另一个视图修改时更新

如何解决SwiftUI - 视图仅在其自身修改时更新,而不是从另一个视图修改时更新

对不起,标题复杂,但我的意思是我有一个显示数组的 ContentView。要将元素添加到此数组,用户可以从 ContentView 中手动插入项目(通过按添加按钮)或从 csv 文件(从另一个视图完成)导入元素。一切正常,除了添加到数组中的新导入元素仅在我关闭并重新打开应用程序时显示在这两种情况下,它们都被正确创建,但在第二种情况下,它们不会立即显示

我在 StackOverflow 上阅读了很多帖子,他们都说必须将数组声明为 @Published,并且需要将类“导入”为 @ObservableObject(我都这样做了)。但是还是不行。

这是我的代码

import SwiftUI
import Combine

class DataManager : Equatable,Identifiable,ObservableObject {

static let shared = DataManager()

@Published var storageValues : [ValueModel] = []
typealias StorageValues = [ValueModel]


func newValue(valueName: String,notes: String?,expires: Date?) {
    let newv = ValueModel(valueName: valueName,notes: notes ?? nil,expires: expires ?? nil)
    storageValues.insert(newv,at: 0)
    storageValues.sort() {
        $0.valueName < $1.valueName
    }
    save() <- This contains objectwillChange.send()
}
//The rest of the code
}

class ValueModel : Codable,Equatable,ObservableObject,Comparable {

    var id = UUID()
    var valueName : String
    var notes : String?
    var expires : Date?
    
    init(valueName: String,expires: Date?) {
        self.valueName = valueName
        self.notes = notes
        self.expires = expires
    }
}

然后是内容视图:

import SwiftUI

struct ContentView: View {
    @Observedobject var dm : DataManager
    @Observedobject var vm : ValueModel
        @State firstPage = true
        @State importSheet = false
        @State addNewValueSheet = false
    
    var body : some View {
    vstack {
    if firstPage = true {
ZStack{
    ForEach(dm.storageValues) { values in
            NavigationLink(
                destination:
                    DetailedView(//The rest of the code),label: {
                    IconView(dm: dm,vm: values)
                })
        }
HStack {
Spacer()
Button(action: { addNewValueSheet = true },label: { Text("+") }
}.sheet(isPresented: $addNewValueSheet,content: { AddNewValue(dm: dm,vm: vm) }


   } else {
    Button(action: {
            importSheet = true
        },label: { Text("Import")}.sheet(isPresented: $importSheet,content: { ImportPage(dm: dm) }

}
Spacer()
HStack {
Button(action: {
            firstPage = true
        },label: { Text("First Page")}
Button(action: {
            firstPage = false
        },label: { Text("Second Page")}
}
}

ImportPage 是一个不同的结构,我在其中使用了 CSV Parser from this post ,最后我使用 newValue 函数将元素添加到 storageValues。 AddNewValue 视图还使用用户插入的数据创建一个新元素,并使用相同的 newValue 函数

在第一种情况下,如上所述,新元素被添加到数组中但不会显示(因为如果我关闭应用程序并重新打开它,它们就会出现)。在第二种情况下,只要用户点击“保存”,AddNewValue 表就会自动关闭,并且新元素会正确显示。我不明白为什么。

有人可以帮我吗?

非常感谢!!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。