代码之家  ›  专栏  ›  技术社区  ›  tech_human

{Singleton类}类型的值没有成员“$showDebugView”

  •  1
  • tech_human  · 技术社区  · 10 月前

    我有一个singleton类,其他singleton类或utils类通过它使用来自的属性。我使用的是SwiftUI中的toggle元素,它需要一个绑定变量。如果我使用视图模型中的@Published变量或视图本身中的@State变量,那么一切都很好,但我希望使用singleton类中的变量作为绑定变量。

    我该怎么做?

    class AppState {
        static let shared = AppState()
        private init() {}
        
        private(set) var moduleState: ModuleState? = ModuleState.shared
    }
    
    class ModuleState {
        static let shared = ModuleState()
        private init() {}
        var moduleState: ModuleState? = ModuleState()
        
        var showDebugView: Binding<Bool> = .constant(false)
    }
    
    struct ContentView: View {
        var body: some View {
            VStack {
                Toggle("Show Debug View",
                       isOn: AppState.shared.moduleState!.$showDebugView.wrappedValue)
                        .toggleStyle(SwitchToggleStyle(tint: .blue))
                        .frame(width: UIScreen.main.bounds.width - 50.0, height: 30.0)
            }
        }
    }
    

    使用上面的代码,我得到了“类型为'ModuleState'的值没有成员'$showDebugView'”的错误。

    如何将showDebugView作为绑定变量传递?

    2 回复  |  直到 10 月前
        1
  •  1
  •   jnpdx    10 月前

    它是 已经 Binding 。你不需要使用 $ 以获得 结合 从属性包装器(就像您使用 @State ).

    您的代码可以是:

    struct ContentView: View {
        var body: some View {
            VStack {
                Toggle("Show Debug View",
                       isOn: AppState.shared.moduleState!.showDebugView)
                        .toggleStyle(SwitchToggleStyle(tint: .blue))
            }
        }
    }
    
        2
  •  0
  •   tech_human    10 月前

    我在singleton类中使用Binding的唯一原因是toggle中的“isOn”需要它。我的应用程序并没有寻找toggle的动态变化值。我找到了一种在Toggle本身中创建自定义绑定的方法。

    如果有人来找代码,请在此处共享代码:

    import SwiftUI
    import Foundation
    
    class AppState {
        static let shared = AppState()
        private init() {}
        
        private(set) var moduleState: ModuleState? = ModuleState.shared
    }
    
    class ModuleState {
        static let shared = ModuleState()
        private init() {}
    
        var showDebugView: Bool = false
    }
    
    struct ContentView: View {
        var body: some View {
            VStack {
                Toggle("Show Debug View",
                       isOn: Binding<Bool> (
                        get: {
                            return AppState.shared.moduleState!.showDebugView
                        },
                        set: {
                            AppState.shared.moduleState!.showDebugView = $0
                            let _ = print("AppState.shared.moduleState!.showDebugView - \(AppState.shared.moduleState!.showDebugView)")
                        }
                     ))
                        .toggleStyle(SwitchToggleStyle(tint: .blue))
                        .frame(width: UIScreen.main.bounds.width - 50.0, height: 30.0)
    
                Spacer()
            }
        }
    }