Aim:

我有一个型号是ObservableObject.它有一个Bool属性,我想用这个Bool属性初始化一个@Binding变量.

Questions:

  1. 如何将@ObservableObject转换为@Binding
  2. 创建@State是初始化@Binding的唯一方法吗?

Note:

  • 我知道我可以使用@ObservedObject/@EnvironmentObject,我认为它很有用,但我不确定一个简单的按钮是否需要访问整个模型.
  • 还是我的理解不正确?

Code:

import SwiftUI
import Combine
import SwiftUI
import PlaygroundSupport

class Car : ObservableObject {

    @Published var isReadyForSale = true
}

struct SaleButton : View {

    @Binding var isOn : Bool

    var body: some View {

        Button(action: {

            self.isOn.toggle()
        }) {
            Text(isOn ? "On" : "Off")
        }
    }
}

let car = Car()

//How to convert an ObservableObject to a Binding
//Is creating an ObservedObject or EnvironmentObject the only way to handle a Observable Object ?

let button = SaleButton(isOn: car.isReadyForSale) //Throws a compilation error and rightly so, but how to pass it as a Binding variable ?

PlaygroundPage.current.setLiveView(button)

推荐答案

可以通过以下方式创建Binding个变量:

  1. @State变量的投影值提供了Binding<Value>
  2. @ObservedObject变量的投影值提供了一个包装器,您可以从中获得其所有属性的Binding<Subject>
  3. 第2点也适用于@EnvironmentObject.
  4. 您可以通过为getter和setter传递闭包来创建绑定变量,如下所示:
let button = SaleButton(isOn: .init(get: { car.isReadyForSale },
                                    set: { car.isReadyForSale = $0} ))

Note:

  • 正如@nayem所指出的,SwiftUI需要在视图中显示@State/@ObservedObject/@EnvironmentObject/103 (added in SwiftUI 2.0)才能自动检测更改.
  • 使用$前缀可以方便地访问投影值.

Swift相关问答推荐

运行异步任务串行运行

SwiftData查询按日期排序的项的属性数组

在SwiftUI中判断选项时避免重复查看

SwiftUI同心圆,通过逐渐出现来显示进度

如何强制创建新的UIViewControllerRenatable|更新Make UIViewController上的视图

一种函数,用于判断变量的类型是否为在SWIFT中作为参数传递的类型

如何写一个;风格;视图修饰符,它会影响特定类型的所有嵌套视图?

更改 SwiftUI 中按钮矩阵的填充 colored颜色

当模式以编程方式关闭时在父视图控制器中触发操作

OSX 中的 Popover 无法确定透明度

NavigationStack 和 TabView - 工具栏和标题不显示

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

如何测试可选 struct 的协议一致性

关联满足约束时的快速协议方法

macOS 守护进程应该由Command Line ToolXcode 模板制作吗?

如何在界面生成器中创建 UILayoutGuide?

你如何在 UIBarItem 中使用 setTitleTextAttributes:forState?

DispatchQueue:不能在非主线程上使用 asCopy = NO 调用

更改在变量的 willSet 块中设置的值

枚举大小写的原始值必须是文字