Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

225
Views
¿Cómo evitar que TabView vuelva a cargar la vista completa en los cambios de @StateObject?

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.

over 4 years ago · Santiago Trujillo
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!