Моя цель — иметь возможность предоставлять предложения в этих текстовых полях с помощью SwiftUI textContentType модификатор.
Я создал собственное текстовое поле, которое можно использовать как обычное текстовое поле или защищенное текстовое поле, например, для пароля, и применил универсальный стиль.
Для простоты вот упрощенная версия текстового поля, демонстрирующая проблему:
Код: Выделить всё
struct CustomTextField: View {
@StateObject var viewModel: TextInputFieldViewModel
var body: some View {
Group {
if viewModel.isSecure {
SecureField("", text: $viewModel.text)
.frame(height: 50)
.background(.gray)
} else {
TextField("", text: $viewModel.text)
.textContentType(viewModel.textContentType)
.frame(height: 50)
.background(.gray)
}
}
}
}
Код: Выделить всё
class TextInputFieldViewModel: ObservableObject {
@Published var text: String
@Published var isSecure: Bool
let textContentType: UITextContentType
init(text: String,
isSecure: Bool = false,
textContentType: UITextContentType) {
self.text = text
self.isSecure = isSecure
self.textContentType = textContentType
}
}
Код: Выделить всё
struct ContentView: View {
var body: some View {
VStack(spacing: 20) {
CustomTextField(viewModel: TextInputFieldViewModel(text: "",
isSecure: false,
textContentType: .emailAddress))
}
.padding()
}
}

Теперь, если я попытаюсь создать имя для входа с адресом электронной почты и паролем, предложение по электронной почте больше не будет работать:
Код: Выделить всё
struct ContentView: View {
var body: some View {
VStack(spacing: 20) {
CustomTextField(viewModel: TextInputFieldViewModel(text: "",
isSecure: false,
textContentType: .emailAddress))
CustomTextField(viewModel: TextInputFieldViewModel(text: "",
isSecure: true,
textContentType: .password))
}
.padding()
}
}
[img]https://i. sstatic.net/KPgZ0o8G.png[/img]
Если я создам форму создания учетной записи следующим образом:
Код: Выделить всё
struct ContentView: View {
var body: some View {
VStack(spacing: 20) {
CustomTextField(viewModel: TextInputFieldViewModel(text: "",
isSecure: false,
textContentType: .emailAddress))
CustomTextField(viewModel: TextInputFieldViewModel(text: "",
isSecure: false,
textContentType: .givenName))
CustomTextField(viewModel: TextInputFieldViewModel(text: "",
isSecure: false,
textContentType: .familyName))
CustomTextField(viewModel: TextInputFieldViewModel(text: "",
isSecure: true,
textContentType: .password))
}
.padding()
}
}
Я подумал, что, возможно, моя фамилия не была настроена, но это было не так, поскольку если бы я поменял порядок на адрес электронной почты, фамилию, имя и пароль - имя не отображает никаких предложений.
Похоже, что бы ни было поле до безопасного ввода текста, предложения не отображаются.
В CustomTextField, если я удалю if- else и просто оставьте только TextField, это работает нормально, однако я бы хотел, чтобы он работал с многоразовым представлением, которое может работать как обычное, так и безопасное текстовое поле.
Есть идеи или обходные пути?
Мне это нужно для поддержки iOS 16+.
Подробнее здесь: https://stackoverflow.com/questions/790 ... in-swiftui
Мобильная версия