SwiftUI 文本框文字颜色问题

3

我遇到了TextField的问题(输入文本的颜色)。我正在使用MVVM模式,我的代码如下:


import SwiftUI

struct ContentView: View {
    @ObservedObject var viewModel: ViewModel

    var body: some View {
        CustomView(email: $viewModel.dataModel.emailID)
    }
}

struct CustomView: View {
    
    @Binding var email: String
        
    var body: some View {
        VStack {
            
            TextField("email", text: $email)
                .foregroundColor(.black)
                .frame(height: 30.0)
                .textContentType(.emailAddress)
                .keyboardType(.emailAddress)
                .background(Color.white)
                .padding([.top, .bottom])
            Spacer()
        }.padding(20)
    }
}


public final class ViewModel: ObservableObject {
    
    /// data model
    public var dataModel: DataModel
    
    public init (model: DataModel) {
        self.dataModel = model
    }
    
}
public final class DataModel {
    
    @Published public var emailID: String
    
    public init(emailID: String) {
        self.emailID = emailID
    }
}


上述代码存在的确切问题是,当我在文本字段中输入文本时,文本颜色也是白色,与背景颜色相同,尽管前景颜色是黑色。请告诉我我错在哪里了。我是通过以下方式从SceneDelegate实例化ContentView的:

let contentView = ContentView(viewModel: ViewModel(model: DataModel(emailID: "")))


在 Xcode 11.4 / iOS 13.4 上运行良好。这是您真实的复现代码吗? - Asperi
@Asperi 我正在使用 Xcode 11.5 和 iOS 13.5.1。这是确切的代码,我可以通过从 SceneDelegate 实例化 ContentView 来重现它。 - Subha_26
@Asperi,我已经编辑了我的问题,并附上了实例化代码。 - Subha_26
1个回答

1

您打破了绑定链。这里是修复后的代码(请注意,一些初始化已更改!):

struct ContentView: View {
    @ObservedObject var viewModel: ViewModel

    var body: some View {
        CustomView(model: viewModel.dataModel)
    }
}

struct CustomView: View {

    @ObservedObject var model: DataModel

    var body: some View {
        VStack {

            TextField("email", text: $model.emailID)
                .foregroundColor(.black)
                .frame(height: 30.0)
                .textContentType(.emailAddress)
                .keyboardType(.emailAddress)
                .background(Color.white)
                .padding([.top, .bottom])
            Spacer()
        }.padding(20)
    }
}


public final class ViewModel: ObservableObject {

    /// data model
    public var dataModel: DataModel

    public init (model: DataModel) {
        self.dataModel = model
    }

}

public final class DataModel: ObservableObject {

    @Published public var emailID: String

    public init(emailID: String) {
        self.emailID = emailID
    }
}

谢谢。它有效了!!!您能否解释一下,当我在自定义视图中有绑定变量时为什么它不起作用? - Subha_26
1
@Subha_26,因为它绑定了不可观察的DataModel。 - Asperi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接