Swiftui 列表更新问题

Posted

技术标签:

【中文标题】Swiftui 列表更新问题【英文标题】:Swiftui List Update issue 【发布时间】:2021-06-26 23:37:48 【问题描述】:

//附加的数据实际上是来自推送通知的数据,它将在列表视图中附加新的通知 问题是更新数组中的数据后,即使日期已成功添加到数组中,视图也不会更新。//

//这是我的观点和方法//

struct ContentView: View 

    
    @ObservedObject var notification = OnlyNotification()
    
    var body: some View 
        NavigationView
                List
                    ForEach(notification.data, id: \.id) Message in
                    NotificationCell(Message:Message)
                
            
        
    


struct NotificationCell: View 
    let Message:MyNotification
    var body: some View 
        NavigationLink(destination: Text(Message.name))
            Image(Message.imageName)
                .cornerRadius(40)
                .overlay(RoundedRectangle(cornerRadius: 40)
                            .stroke(Color.gray, lineWidth: 1))
            VStack(alignment: .leading) 
                Text(Message.name)
                    .font(.headline)
                Text(Message.ImageLink)
                    .font(.subheadline)
                    .foregroundColor(Color.gray)
            
        .navigationBarTitle(Message.name)
    

struct MyNotification:Identifiable 
    var id = UUID()
    var name:String
    var ImageLink:String
    var Message:String
    var imageName:String return name
    

class OnlyNotification: ObservableObject
    @Published var data = [MyNotification]()
    init() 
        let notification1 = MyNotification(name: "Rafael Nadal", ImageLink: "New", Message: "Hi Budy")
        addnotification(Data: notification1)
    
    public func addnotification(Data:MyNotification)
        self.data.insert(MyNotification(name: Data.name, ImageLink: Data.ImageLink, Message: Data.Message), at: 0)
    
    public func getData() ->[MyNotification] 
        return data
    
    

// 从 AppDelegate 追加项目// 让 obj = OnlyNotification()

 obj.addnotification(Data: MyNotification(name: "\(notification.request.content.userInfo["Name"]!)", ImageLink: "New", Message: "\(notification.request.content.userInfo["Message"]!)"))

【问题讨论】:

【参考方案1】:

您正在显示来自“ContentView @ObservedObject var notification = OnlyNotification()”的数据, 但是在您的代码的其他地方,您正在使用另一个“let obj = OnlyNotification()”并添加到它。 它们是不同的对象。

【讨论】:

对不起,我是新手,您能告诉我如何实例化 globalay 类的对象,以便我可以在应用程序委托中使用它 如果没有“AppDelegate”代码,很难说出你想做什么以及如何调用它,但试试这个:在你的“AppDelegate”视图中,像这样声明 obj:“@ObservedObject var obj:只有通知” 我在 AppDelegate 中获取 FCM Payload,并从那里将有效负载映射到 Observable 类,该类具有将数据添加到已发布数组的功能,然后用于创建通知视图 @ObservedObject var obj = OnlyNotification() 这无济于事我已经使用它仍然视图没有更新,但数据已成功添加到数组中 那不是我建议你做的。这就是我的建议:“@ObservedObject var obj: OnlyNotification”而不是“@ObservedObject var obj = OnlyNotification()”【参考方案2】:

在类外全局声明对象

var Myinstance:OnlyNotification?

然后在类的初始化器中 这样做

我的实例 = 自我

然后在任何地方访问这个全局实例来访问同一个实例的类的函数和对象

【讨论】:

以上是关于Swiftui 列表更新问题的主要内容,如果未能解决你的问题,请参考以下文章

应用`listRowInsets`时SwiftUI列表未更新

更新列表中的一行 (SwiftUI)

在 SwiftUI 中动态更新列表?

更新 SwiftUI 列表中的选定对象

使用 RxSwift 在网络请求后更新 SwiftUI 列表

删除嵌套属性中的元素时更新 SwiftUI 列表