目的:
我有一个模型,是一个ObservableObject。它有一个Bool属性,我想使用这个Bool属性初始化一个@Binding变量。
问题:
@ObservableObject转换为@Binding?@State的唯一方法--初始化@Binding?G 213
注意:
@ObservedObject / @EnvironmentObject,我认为它很有用,但我不确定一个简单的按钮是否需要访问整个模型。代码:
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)发布于 2019-12-10 03:58:09
可以通过以下方式创建Binding变量:
@State变量的投影值提供了一个Binding<Value>@ObservedObject变量的投影值,提供了一个包装器,您可以从该包装器获得所有properties@EnvironmentObject的Binding<Subject>。let button = SaleButton(isOn: .init(get: { car.isReadyForSale },
set: { car.isReadyForSale = $0} ))注:
正如@nayem所指出的,automatically.
$前缀来方便地访问SwiftUI视图中的@State / @ObservedObject / @EnvironmentObject / @StateObject (添加在SwiftUI 2.0中)来检测更改。发布于 2019-12-10 04:12:10
ObservableObject。如果希望与对象的状态同步,则不可避免地要观察有状态对象的状态。从选项来看,最大的共同点是:- `@State`
- `@ObservedObject`
- `@EnvironmentObject`
这取决于你,哪一个适合你的用例。
在现实中,你会得到这样的东西:
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做好了准备,您将使用以下方法初始化视图:
let contentView = ContentView().environmentObject(Car())发布于 2019-12-10 04:11:19
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中有以下内容
// Create the SwiftUI view that provides the window contents.
let contentView = ContentView()
.environmentObject(Car())https://stackoverflow.com/questions/59259921
复制相似问题