SwiftUI:将绑定传递给 init 函数内部的对象初始值设定项

问题描述 投票:0回答:2

在我的应用程序中,我想初始化一个 @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) 不允许这样做。 现在我不知道如何解决这个问题,有人可以帮忙吗?

ios swift swiftui initializer
2个回答
0
投票

您需要将

showColor
更改为
@Published
并在视图中初始化您的类,如下所示:

@StateObject var myClass: MyClass = MyClass()

-1
投票
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()
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.