[英]SwiftUI Combine: @Published is only available on properties of classes
I have the following code and Im getting the message error:我有以下代码,我收到消息错误:
'wrappedValue' is unavailable: @Published is only available on properties of classes
'wrappedValue' 不可用:@Published 仅适用于类的属性
//*
/**
Chat
Created on 29/07/2020
*/
import SwiftUI
let lightGreyColor = Color(red: 239.0/255.0, green: 243.0/255.0, blue: 244.0/255.0, opacity: 1.0)
struct ConnectionView: View {
@ObservedObject var keyboardResponder = KeyboardResponder()
@ObservedObject var viewModel = ConnectionVM()
// @State var uuid1: String = ""
// @State var uuid2: String = ""
@State var authenticationDidFail: Bool = false
var body: some View {
return VStack {
WelcomeText()
LogoImage()
UUIDTextField(uuid: viewModel.uuid1)
UUIDTextField(uuid: viewModel.uuid2)
if authenticationDidFail {
Text("Information not correct. Try again.")
.offset(y: -10)
.foregroundColor(.red)
}
Button(action: {
print("Button tapped")
}) {
LoginButtonContent()
}
}
.padding()
.offset(y: -keyboardResponder.currentHeight*0.5)
}
struct WelcomeText : View {
var body: some View {
return Text("Welcome!")
.font(.largeTitle)
.fontWeight(.semibold)
.padding(.bottom, 20)
}
}
struct LogoImage : View {
var body: some View {
return Image("logo")
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: 150, height: 150)
.clipped()
.cornerRadius(150)
.padding(.bottom, 75)
}
}
struct UUIDTextField : View {
@Published var uuid: String
var body: some View {
return TextField("UUID", text: $uuid)
.padding()
.background(lightGreyColor)
.cornerRadius(5.0)
.padding(.bottom, 20)
}
}
struct LoginButtonContent : View {
var body: some View {
return Text("LOGIN")
.font(.headline)
.foregroundColor(.white)
.padding()
.frame(width: 220, height: 60)
.background(Color.green)
.cornerRadius(15.0)
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ConnectionView()
}
}
how can I pass @Published var by parameter to a subview.如何通过参数将@Published var 传递给子视图。
If i use Binding instead of published I get this error:如果我使用绑定而不是发布,我会收到此错误:
Cannot convert value of type 'String' to expected argument type 'Binding'
无法将“字符串”类型的值转换为预期的参数类型“绑定”
@Published
can only be used in classes and sub View
is a struct. @Published
只能在类中使用,子View
是一个结构。 You should use @Binding
instead of @Published
to pass a binding variable to a sub View
.您应该使用
@Binding
而不是@Published
将绑定变量传递给子View
。
struct UUIDTextField : View {
@Binding var uuid: String
var body: some View {
return TextField("UUID", text: $uuid)
.padding()
.background(lightGreyColor)
.cornerRadius(5.0)
.padding(.bottom, 20)
}
}
Then use binding to the passed on parameter.然后使用绑定到传递的参数。
UUIDTextField(uuid: $viewModel.uuid1)
UUIDTextField(uuid: $viewModel.uuid2)
If you're getting this in a View Model, you probably mistakenly defined it as a struct -- and not a class that extends ObservableObject
如果你在视图 Model 中得到这个,你可能错误地将它定义为一个结构——而不是一个扩展
ObservableObject
的 class
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.