Заполнитель не отображается после очистки текстового поля SwiftUI - PullRequest
0 голосов
/ 28 марта 2020

У меня есть 2 текстовых поля ...

 TextField("Username", text: $viewModel.usernameStore){}
        .padding(.all, 8)
        .background(Color(red:0.5, green: 0.5, blue: 0.5, opacity: 0.3))
        .cornerRadius(4.0)
        .padding(.bottom, 5)


    SecureField("Password", text: $viewModel.passwordStore){}
        .padding(.all, 8)
        .background(Color(red:0.5, green: 0.5, blue: 0.5, opacity: 0.3))
        .cornerRadius(4.0)
        .padding(.bottom, 5)

И функция, которая очищает их все ...

    func clearCredentials(){
    $viewModel.usernameStore.wrappedValue = ""
    $viewModel.passwordStore.wrappedValue = ""
 }

Когда вызывается функция и текстовые поля очищаются местозаполнителем пароля Переполняется, но имя пользователя не заполняется, оно только очищается.

Я предполагаю, что это связано с тем, что пароль является безопасным полем. Как я могу получить имя пользователя для повторного заполнения текста заполнителя после очистки?

Ответы [ 2 ]

1 голос
/ 28 марта 2020

я думаю, что это ошибка SwiftUI, потому что если вы нажмете в другом поле, заполнитель появится снова ...

У меня есть другое решение для вас (это стандартный способ, которым Apple делает это, чтобы очистить текстовые поля, чтобы пользователь знал, как с этим обращаться ...

проверьте это:

struct CustomTextField: UIViewRepresentable {

    class Coordinator: NSObject, UITextFieldDelegate {

        @Binding var text: String

        init(text: Binding<String>) {
            _text = text
        }

        func textFieldDidChangeSelection(_ textField: UITextField) {
            text = textField.text ?? ""
        }
    }

    @State var secure : Bool
    @State var initialText : String
    @Binding var text: String
    @State var placeholder : String

    func makeUIView(context: UIViewRepresentableContext<CustomTextField>) -> UITextField {
        let textField = UITextField(frame: .zero)
        textField.placeholder = placeholder
        textField.delegate = context.coordinator
        textField.text = initialText
        textField.clearButtonMode = .always
        textField.isSecureTextEntry = secure
        return textField
    }

    func makeCoordinator() -> CustomTextField.Coordinator {
        return Coordinator(text: $text)
    }

    func updateUIView(_ uiView: UITextField, context: UIViewRepresentableContext<CustomTextField>) {
        uiView.text = text
        uiView.placeholder = placeholder
    }
}

struct ContentView: View {

    @State var username : String = ""
    @State var password : String = ""

    func clearCredentials(){
        username = ""
        password = ""

    }

    var body: some View {
        VStack {

            CustomTextField(secure: false, initialText: "", text: $username, placeholder: "Username")
                .fixedSize()
                .padding(.all, 8)
                .background(Color(red:0.5, green: 0.5, blue: 0.5, opacity: 0.3))
                .cornerRadius(4.0)
                .padding(.bottom, 5)


             CustomTextField(secure: true, initialText: "", text: $password , placeholder: "Password")
                .fixedSize()
                .padding(.all, 8)
                .background(Color(red:0.5, green: 0.5, blue: 0.5, opacity: 0.3))
                .cornerRadius(4.0)
                .padding(.bottom, 5)
            Button(action: {
                self.clearCredentials()
            }) {
                Text("Clear credentials")
            }

        }.padding()
    }
}
0 голосов
/ 28 марта 2020

SwiftUI TextField поддерживает заполнитель текста так же, как это делал UITextField - серый текст, который отображается в текстовом поле, когда он пуст, либо дает подсказку («Введите свой пароль»), либо показывает некоторые примеры данных.

Чтобы установить заполнитель, передайте его как часть инициализатора для вашего текстового поля, например:

struct ContentView: View {
    @State private var emailAddress = ""

    var body: some View {
        TextField("johnnyappleseed@apple.com", text: $emailAddress)
            .textFieldStyle(RoundedBorderTextFieldStyle())
            .padding()
    }
}
...