首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自ObservableObject的绑定值

来自ObservableObject的绑定值
EN

Stack Overflow用户
提问于 2019-12-10 03:47:41
回答 4查看 25.6K关注 0票数 44

目的:

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

问题:

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

G 213

注意:

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

代码:

代码语言:javascript
复制
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)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-12-10 03:58:09

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

  1. @State变量的投影值提供了一个Binding<Value>
  2. @ObservedObject变量的投影值,提供了一个包装器,您可以从该包装器获得所有properties
  3. Point 2应用于@EnvironmentObjectBinding<Subject>

代码语言:javascript
复制
let button = SaleButton(isOn: .init(get: { car.isReadyForSale },
                                    set: { car.isReadyForSale = $0} ))

注:

正如@nayem所指出的,automatically.

  • Projected值可以通过使用$前缀来方便地访问SwiftUI视图中的@State / @ObservedObject / @EnvironmentObject / @StateObject (添加在SwiftUI 2.0中)来检测更改。
票数 54
EN

Stack Overflow用户

发布于 2019-12-10 04:12:10

  1. 您有几个选项可以观察ObservableObject。如果希望与对象的状态同步,则不可避免地要观察有状态对象的状态。从选项来看,最大的共同点是:

代码语言:javascript
复制
- `@State`
- `@ObservedObject`
- `@EnvironmentObject`

这取决于你,哪一个适合你的用例。

  1. No.但是,您需要有一个对象,它可以在任何时间点观察到对该对象所做的任何更改。

在现实中,你会得到这样的东西:

代码语言:javascript
复制
class Car: ObservableObject {
    @Published var isReadyForSale = true
}

struct ContentView: View {

    // It's upto you whether you want to have other type 
    // such as @State or @ObservedObject
    @EnvironmentObject var car: Car

    var body: some View {
        SaleButton(isOn: $car.isReadyForSale)
    }

}

struct SaleButton: View {
    @Binding var isOn: Bool
    var body: some View {
        Button(action: {
            self.isOn.toggle()
        }) {
            Text(isOn ? "Off" : "On")
        }
    }
}

如果您已经为@EnvironmentObject做好了准备,您将使用以下方法初始化视图:

代码语言:javascript
复制
let contentView = ContentView().environmentObject(Car())
票数 18
EN

Stack Overflow用户

发布于 2019-12-10 04:11:19

代码语言:javascript
复制
struct ContentView: View {
    @EnvironmentObject var car: Car

    var body: some View {
        SaleButton(isOn: self.$car.isReadyForSale)
    }
}

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")
        }
    }
}

确保您的SceneDelegate中有以下内容

代码语言:javascript
复制
// Create the SwiftUI view that provides the window contents.
let contentView = ContentView()
    .environmentObject(Car())
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59259921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档