简体   繁体   English

SwiftUI 组合:@Published 仅适用于类的属性

[英]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()
    }
}

My question is我的问题是

how can I pass @Published var by parameter to a subview.如何通过参数将@Published var 传递给子视图。

在此处输入图像描述

Update Question更新问题

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM