@Опубликованная структура в SwiftUI не публикуется

#swiftui

#свифтуи

Вопрос:

Смотрите мой код ниже. Моя проблема в том , что если я изменюсь accessToken через UserService.shared.currentStore.accessToken = xxx , SwiftUI не опубликует, и вообще не будет никаких обновлений StoreBanner .

 //SceneDelegate let contentView = ContentView()  .environmentObject(UserService.shared)  //Define class UserService: ObservableObject {  @Published var currentStore = Store.defaultValues()   static let shared = UserService() }  struct Store: Codable, Hashable {  var storeName: String = ""  var accessToken: String = "" }  //Use it struct StoreBanner: View {  var body: some View {  Group {  if UserService.shared.currentStore.accessToken.isNotEmpty {  ShopifyLinkedBanner()  } else {  ShopifyLinkBanner()  }  }    }  }  

Комментарии:

1. Эй! Я думаю, это потому, что вы напрямую обращаетесь к свойству статического экземпляра. Вы использовали класс «@ObservableObject «со свойством » @published», которое является правильным, но вы никогда не использовали @ObservedObject, например, для получения обновлений. Я разговариваю по телефону, но могу привести пример кода, когда вернусь за свой рабочий стол. по сути, вам нужно свойство ‘@ObservedObject, которое является хранилищем (или, возможно, контейнером хранилища, который также публикует изменения).

2. извините, только что видел, как вы передали экземпляр в среду. Может быть, вы можете просто использовать объект среды в своем представлении и получить к нему доступ вместо статического экземпляра ? @EnvironmentObject хранилище var: Служба пользователей

Ответ №1:

Вы пытаетесь использовать UserService inside StoreBanner без использования оболочки свойств, чтобы сообщить представлению о необходимости реагировать на обновления. Без оболочки @ObservedObject свойств View у него нет механизма, позволяющего узнать, что какие-либо @Published свойства были обновлены.

Попробуйте это:

 struct StoreBanner: View {  @ObservedObject private var userService = UserService.shared    var body: some View {  Group {  if userService.currentStore.accessToken.isNotEmpty {  ShopifyLinkedBanner()  } else {  ShopifyLinkBanner()  }  }   } }  

Это должно сработать, если предположить, что вы установили accessToken где-то в своем коде один и тот же экземпляр UserService .

Комментарии:

1. @LiangWang это ответ на ваш вопрос?