С 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()))