在我的应用程序中,我想初始化一个 @StateObject 属性,该属性在其初始值设定项中接受绑定。我创建了一个示例项目来尝试解决这个问题。
struct ContentView: View {
@StateObject var myClass: MyClass
@State var showColor: Bool = false
init() {
self._myClass = StateObject(wrappedValue: MyClass(showColor: $showColor)) // This does not work
}
var body: some View {
VStack {
if showColor {
Image(systemName: "globe")
.resizable()
.foregroundColor(showColor ? .accentColor : .black)
.frame(width: 50, height: 50)
}
Button {
myClass.doSomething()
} label: {
Text("Do Something")
.padding()
.background(Color.blue)
.foregroundColor(Color.white)
.cornerRadius(10)
}
}
.padding()
}
}
MyClass 类如下所示:
class MyClass: ObservableObject {
@Binding var showColor: Bool
init(showColor: Binding<Bool>) {
self._showColor = showColor
}
func doSomething() {
self.showColor.toggle()
}
}
doSomething
应切换 ContentView 的 showColor
。
我尝试在创建 MyClass 对象之前初始化 init 函数内的变量。此外,使用 State 或 StateObject 初始值设定项并包装值的方法也不起作用。此外,我尝试使用
weak var
并将 ContentView 传递给 myClass,但 xCode (SwiftUI) 不允许这样做。
现在我不知道如何解决这个问题,有人可以帮忙吗?
您需要将
showColor
更改为 @Published
并在视图中初始化您的类,如下所示:
@StateObject var myClass: MyClass = MyClass()
struct ContentView: View {
@StateObject var myClass: MyClass = MyClass()
var body: some View {
VStack {
Image(systemName: "globe")
.resizable()
.frame(width: 50, height: 50)
.foregroundColor(myClass.showColor ? .accentColor : .black)
Button {
myClass.doSomething()
} label: {
Text("Do Something")
.padding()
.background(Color.blue)
.foregroundColor(Color.white)
.cornerRadius(10)
}
}
.padding()
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
class MyClass: ObservableObject {
@Published var showColor: Bool = false
func doSomething() {
self.showColor.toggle()
}
}