1

我的应用程序有一个非常标准的 TabView 设置。一切正常,但是当我动态更新通知页面的 TabView 徽章计数时,整个视图都会重新加载,我想知道这是否是一个错误,或者我是否可能忽略了某些事情并做错了什么。以下是相关代码:

MainView.swift

@EnvironmentObject var userState: UserState

var body: some View {
    if(userState.isLoggedIn()) {
        TabView {
            NewsView()
                .tabItem {
                    Label("News", image: "home-alt")
                }
            
            SocialView()
                .tabItem {
                    Label("Social", image: "comment-alt-smile")
                }
            
            NotificationsView()
                .tabItem {
                    Label("Notifications", image: "bell")
                }.badge(userState.notificationCount)

            AccountView()
                .tabItem {
                    Label("More", image: "bars")
                }
        }
    }
}

UserState.swift

final class UserState: ObservableObject {
    ...

    @Published var notificationCount: Int = 0

    ...
}

NotificationsView.swift

var body: some View {
    NavigationView {
        ZStack {
            Color.lightGray.edgesIgnoringSafeArea(.top)
            if notificationCards.notifications.count < 1 {
                VStack {
                    Spacer()
                    ProgressView().onAppear {
                        notificationCards.getNotifications(last: nil)
                    }
                    Spacer()
                }
            } else {

                List {
                    ForEach($notificationCards.notifications.indices, id: \.self) { index in
                        let notif = notificationCards.notifications[index]
                        NotificationCardView(viewModel: NotificationCardViewModel(with: notif))
                            .onAppear {
                                if index == notificationCards.notifications.count - 1 {
                                    notificationCards.getNotifications(last: notificationCards.notifications.last?.updatedAt)
                                }
                            }
                            .padding(.vertical, 10)
                            .listRowSeparator(.hidden)
                            .listRowBackground(Color.clear)
                            .listRowInsets(EdgeInsets(top: 0, leading: 10, bottom: 0, trailing: 10))
                    }.onDelete { indexSet in
                        delete(at: indexSet)
                    }

                }
                .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .leading)
                .listStyle(.plain)
                .refreshable {
                    print("Refreshing!")
                    notificationCards.notifications.removeAll()
                    notificationCards.getNotifications(last: nil)
                }
            }
        }
        .navigationTitle("Notifications")
        
    }
}

现在,我在 NotificationCardViewModel 中有一个“清除”按钮,我按下它只是为了随机生成一个新的徽章计数。当我按下按钮时,不只是更新徽章计数,而是重新加载整个视图,包括所有网络请求,并且所有局部变量都被清除,就像正在调用表 reload() 一样。我试过用 DispatchQueue.main.async() 来做这个,但没有运气。

这是 NotificationCardView.swift 中非常简单的代码,它是我的通知列表的单元格视图。老实说,这段代码的位置并不重要,因为我到处都试过了,结果都是一样的:

Button {
    userState.notificationCount = Int.random(in: 0..<100)
}

每次触发此代码时,无论我尝试将更改发布到通知计数的哪个视图或类,当前视图都会重新加载。徽章确实得到了更新,但显然 SwiftUI 中内置了一些东西,因此对标签栏的任何更新都会立即刷新并重新加载所有基本视图?我不知道,也不敢相信这是否真的是功能。

有没有其他人有这方面的经验以及如何让它发挥作用?

4

0 回答 0