簡體   English   中英

SwiftUI ObservedObject 登錄成功后未更新視圖

[英]SwiftUI ObservedObject not updating view after successful login

為了在成功登錄后從我的根視圖顯示我的內容,我嘗試使用ObservedObjectEnvironmentObject ,但無濟於事。

例如如下:

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 它仍然無法正常工作。

我有兩篇論文:

  1. 可能是視圖沒有使用Group等正確設置。我也嘗試使用@ViewBuilder等,沒有區別。

  2. 可能是因為某種原因存在兩個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM