#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 это ответ на ваш вопрос?