SwiftUI TextField максимальная длина - PullRequest
7 голосов
/ 06 июня 2019

Можно ли установить максимальную длину для TextField?Я думал о том, чтобы обработать его, используя событие onEditingChanged, но оно вызывается только тогда, когда пользователь начинает / заканчивает редактирование, и не вызывается, когда пользователь печатает.Я также прочитал документы, но еще ничего не нашел.Есть ли обходной путь?

TextField($text, placeholder: Text("Username"), onEditingChanged: { _ in
  print(self.$text)
}) {
  print("Finished editing")
}

1 Ответ

12 голосов
/ 06 июня 2019

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

Например:

import Combine
import SwiftUI

final class UserData: BindableObject {

    let didChange = PassthroughSubject<UserData,Never>()

    var textValue = "" {
        willSet {
            self.textValue = String(newValue.prefix(8))
            didChange.send(self)
        }
    }
}

struct ContentView : View {

    @EnvironmentObject var userData: UserData

    var body: some View {
        TextField($userData.textValue, placeholder: Text("Enter up to 8 characters"), onCommit: {
        print($userData.textValue.value)
        })
    }
}

Если модель позаботится об этом, код пользовательского интерфейса станет проще, и вам не нужно беспокоиться о том, что более длинное значение будет присвоено textValue через какой-то другой код; модель просто не позволит этого.

Чтобы ваша сцена использовала объект модели данных, измените присвоение на rootViewController в SceneDelegate на что-то вроде

UIHostingController(rootView: ContentView().environmentObject(UserData()))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...