如何在绑定值SwiftUI中观察更新

如何在绑定值SwiftUI中观察更新,swiftui,Swiftui,我不确定是否正确创建了自定义文本字段,因为我无法观察到@bind文本的值更改。运行以下代码时,您可能会发现在文本字段中手动输入文本时,print(text) import SwiftUI @main struct TestOutWeirdTextFieldApp: App { @State var text: String = "" { didSet { print(text) } }

我不确定是否正确创建了自定义文本字段,因为我无法观察到
@bind
文本的值更改。运行以下代码时,您可能会发现在文本字段中手动输入文本时,
print(text)



import SwiftUI

@main
struct TestOutWeirdTextFieldApp: App {

    @State var text: String = "" {
        didSet {
            print(text)
        }
    }

    var body: some Scene {
        WindowGroup {
            StandardTextField(placeholderText: "Enter text", defaultText: $text)
        }
    }
}


struct StandardTextField: View {

    @State var placeholderText: String {
        didSet {
            print(#line)
            print(placeholderText)
        }
    }
    @Binding var defaultText: String {
        didSet {
            print(#line)
            print(defaultText)
        }
    }
    @State var systemImage: String?
    @State var underlineColor: Color = .accentColor
    @State var edges: Edge.Set = .all
    @State var length: CGFloat? = nil
    @State var secure: Bool = false

    var body: some View {
        HStack {
            if secure {
                SecureField(placeholderText, text: $defaultText)
                    .foregroundColor(underlineColor)
            } else {
                TextField(placeholderText, text: $defaultText)
                    .foregroundColor(underlineColor)
            }
            if let systemImage = systemImage {
                Image(systemName: systemImage)
                    .foregroundColor(.white)
            }
        }
        .overlay(
            Rectangle()
                .frame(height: 2)
                .padding(.top, 35)
        )
        .foregroundColor(underlineColor)
        .padding(edges, length)
    }
}

struct StandardTextView_Previews: PreviewProvider {


    static var previews: some View {
        StandardTextField(placeholderText: "Placement text", defaultText: .constant("")).previewLayout(.sizeThatFits)
    }
}


您需要使用
.onChange(of:
修饰符,如

    HStack {
       // ... your code here
    }
    .onChange(of: defaultText) { print($0) }      // << this !!
    .overlay(
HStack{
//…您的代码在这里
}

.onChange(of:defaultText){print($0)}/而不是
didSet
您需要使用
.onChange(of:
修饰符,如

    HStack {
       // ... your code here
    }
    .onChange(of: defaultText) { print($0) }      // << this !!
    .overlay(
HStack{
//…您的代码在这里
}
.onChange(of:defaultText){print($0)}//