如何创建一个可以在 SwiftUI 中更新的单例

Jus*_*ock 3 singleton struct swiftui

我想创建一个全局变量来显示加载视图。我尝试了很多不同的方法,但不知道该怎么做。我需要能够在整个应用程序中访问此变量,并在更改单例的布尔值时更新 MotherView 文件。

struct MotherView: View {
    
    @StateObject var viewRouter = ViewRouter()
        
    var body: some View {
        
        if isLoading { //isLoading needs to be on a singleton instance
            Loading()
        }

        
        switch viewRouter.currentPage {
        case .page1:
            ContentView()
        case .page2:
            PostList()
        }
    }
}

struct MotherView_Previews: PreviewProvider {
    static var previews: some View {
        MotherView(viewRouter: ViewRouter())
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试了下面的单例,但它不允许我更新共享实例?如何更新单例实例?

struct LoadingSingleton {
    static let shared = LoadingSingleton()
    var isLoading = false

    private init() { }
}
Run Code Online (Sandbox Code Playgroud)

jn_*_*pdx 11

使您的单例 aObservableObject具有以下@Published属性:

struct ContentView: View {
    @StateObject var loading = LoadingSingleton.shared
    
    var body: some View {
        if loading.isLoading {
            Text("Loading...")
        }
        ChildView()
        Button(action: { loading.isLoading.toggle() }) {
            Text("Toggle loading")
        }
    }
}

struct ChildView : View {
    @StateObject var loading = LoadingSingleton.shared

    var body: some View {
        if loading.isLoading {
            Text("Child is loading")
        }
    }
}

class LoadingSingleton : ObservableObject {
    static let shared = LoadingSingleton()
    @Published var isLoading = false
    
    private init() { }
}
Run Code Online (Sandbox Code Playgroud)

我应该提到,在 SwiftUI 中,通常使用.environmentObject通过视图层次结构传递依赖项,而不是使用单例——这可能值得研究。