Tengo una variable dentro de mi @StateObject que se usa para mostrar notificaciones de mensajes nuevos. Se actualiza periódicamente desde mi backend (push noti). El problema es que una vez que esta variable actualiza la insignia, sacará al usuario de otras pestañas inesperadamente (es decir, recarga todo el TabView y lo lleva a la primera pestaña). Quiero que la insignia de notificación se actualice sin interferir con lo que está haciendo el usuario. Intenté usar equatable() , pero fue en vano. Parece que TabView todo en los cambios de objetos de estado. ¿Hay alguna manera de recargar solo las etiquetas de las pestañas? cualquier ayuda será apreciada.
ContentView.swift :
struct ContentView: View { @State var tab: UInt = 0 @StateObject var messenger: MessagingViewModel = MessagingViewModel() @State var firstAppear = true init() { UITabBar.appearance().backgroundColor = UIColor(Color.white) } var body: some View { TabView(selection: $tab) { HomeMarket(tab: $tab) .tabItem { Label("Market", systemImage: "house.fill") }.tag(0) AddItems(tab: $tab) .tabItem { Label("Add Item", systemImage: "plus.circle") }.tag(1) MessageList(tab: $tab) .tabItem { Label("Messages", systemImage: "envelope.fill") } .tag(2) .badge(messenger.newMsgCount) } .accentColor(Color("AccentColor")) .onAppear() { if firstAppear { messenger.getAllMessages() firstAppear = false } } .environmentObject(messenger) } } MessengerViewModel.swift : (abreviado para SO. Incluso esta pequeña muestra causa el mismo problema)
class MessagingViewModel: ObservableObject { @Published var newMsgCount = 0 init(){// connect socket...} func setUpChatListener() { DispatchQueue.main.async { self.manager.defaultSocket.on("Private Message") { data, ack in do { self.newMsgCount += 1 //do what ever else I need to do with the chat... } catch let err { print(err) } } } } }Realmente me he topado con un obstáculo con este. ¿Voy a tener que usar el sistema push de Apple? Me resulta extraño que no pueda volver a cargar el pequeño icono para mostrar el recuento de mensajes nuevos en lugar de volver a cargar todo.