Тип UITextContent не всегда работает в SwiftUIIOS

Программируем под IOS
Ответить
Anonymous
 Тип UITextContent не всегда работает в SwiftUI

Сообщение Anonymous »

У меня есть приложение, которому требуется несколько форм с текстовыми полями, такими как «логин», «забыли пароль», «создать учетную запись» и т. д.
Моя цель — иметь возможность предоставлять предложения в этих текстовых полях с помощью 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»