[英]SwiftUI ObservedObject not updating view after successful login
為了在成功登錄后從我的根視圖顯示我的內容,我嘗試使用ObservedObject
和EnvironmentObject
,但無濟於事。
例如如下:
struct RootView: View {
@EnvironmentObject var loginManager: LoginManager
var body: some View {
Group {
if loginManager.isLoggedIn {
SegmentedView()
}
else {
WelcomeView()
}
}
}
}
class LoginManager: ObservableObject {
static let shared = LoginManager()
var cancellable = Set<AnyCancellable>()
@Published var isLoggedIn = false
...
func login(...) {
...
// on success
self.isLoggedIn = true
}
LoginManager
保留在SceneDelegate
中並放入環境中:
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
var loginManager = LoginManager.shared
...
// the view passed to window.rootUiewController via UIHostingController
let contentView = RootView().environmentObject(loginManager)
登錄后,它會直接回到我的WelcomeView
。 我錯過了什么?
編輯
這是一個新的方面。 我有一個用於LoginView
的視圖 model 來管理日期字段中的數據。 當按下登錄按鈕時,我在此視圖 model 中調用login()
方法。
我需要在視圖 model 中進行兩個.sink
回調,因為我必須通過將loading
標志設置為 false 來關閉加載指示器。
所以我不能直接調用self.isLoggedIn = true
因為我在視圖 model 中,而不是LoginManager
。 相反,我打電話
self.loginManager.isLoggedIn = true
我懷疑這條線不起作用。
視圖 model 和登錄管理器之間的連接是這樣完成的
@ObservedObject var loginManager = LoginManager.shared
但是,在將其轉移到LoginManager
,我確實是從那里調用self.isLoggedIn
。 它仍然無法正常工作。
我有兩篇論文:
可能是視圖沒有使用Group
等正確設置。我也嘗試使用@ViewBuilder
等,沒有區別。
可能是因為某種原因存在兩個LoginManager
實例,或者RootView
以某種方式被重新初始化為isLoggedIn
為假的新實例。 但是我多年來一直在創建像這樣的 Swift 單例:
static 讓共享 = LoginManager()
從來沒有任何問題。
正如評論中提到的,我在全部切換到@EnvironmentObject
時遇到了另一個錯誤:
Fatal error: No ObservableObject of type LoginManager found. A View.environmentObject(_:) for LoginManager may be missing as an ancestor of this view.: file SwiftUI, line 0
我想我得到了錯誤。
我假設.sink(receiveCompletion:
總是有一個錯誤,因為我指的是它的模板。但是無論如何都會調用完成塊。
不幸的是,如果您在其中插入參數error in
它將永遠不會nil
,而是包含類似
Combine.Subscribers.Completion<module.CustomError>.finished
所以我想,你不應該再在那里檢查錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.