我有一个单例类,其他单例类或实用程序类正在通过它使用中的属性.我正在使用SwiftUI中的切换元素,该元素需要绑定变量.如果我使用视图模型中的@Published变量或视图本身中的@State变量,那么一切都可以正常工作,但我希望使用单例类中的变量作为绑定变量.

我该怎么做?

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’的值没有成员‘$showegView’"错误.

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

推荐答案

它是already a Binding.您不需要使用$来从属性包装器获取Binding(就像使用@State一样).

您的代码可以只是:

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

Swift相关问答推荐

使用简单变量和函数的奇怪行为

Swift:iVar + Equatable上的协议约束

按变换zoom 在UIView中不起作用

如何使泡泡上的箭头直达封闭矩形

如何使用AsyncTimerSequence获取初始时钟,然后在指定的时间间隔内开始迭代?

如何将新事例添加到枚举中?

在SwiftUI中如何预览嵌套的ScrollView,以避免触发可刷新修饰符

UIBezierPath() 和 DragGesture:连接点创建角而不是曲线

为什么即使 `C` 是一个不是 `Sendable` 的类,Task` 也能工作?

使用 Async-Await 和 Vapor-Fluent 创建 CRUD 函数 - Swift 5.6

如何制作具有 2 个视图的 3D 旋转动画?

如何在 SwiftUI 中获取视图的位置

P384 公钥获取IncorrectParameterSize

对齐时如何避免图像尺寸缩小

如何在 SwiftUI 中正确实现Collection 夹?

如何从 LLDB 调用带有断点的 Swift 函数?

通用枚举菜单 SwiftUI

将项目引用添加到 Swift iOS XCode 项目并调试

如何在 GCD 中停止 DispatchWorkItem?

如何在 Swift 中遍历 struct 属性?