我的应用程序有一个非常标准的 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 中内置了一些东西,因此对标签栏的任何更新都会立即刷新并重新加载所有基本视图?我不知道,也不敢相信这是否真的是功能。
有没有其他人有这方面的经验以及如何让它发挥作用?