Сорин, по крайней мере, в моем понимании, SwiftUI предназначен только для уровня представления, он не должен заменять вашу модель. И он «реактивный», в отличие от UIKit, поэтому заставить представление выполнять действия, подобные модели, очень сложно.
Я бы подошел к задаче так:
class LoginModel : BindableObject {
var didChange = PassthroughSubject<LoginModel, Never>()
private(set) var username: String? {
didSet {
didChange.send(self)
}
}
func load() {
DispatchQueue.main.asyncAfter(deadline: .now() + 5.0) {
self.username = "Sorin"
}
}
}
Это объект модели, инкапсулирующий наш код для входа. Асинхронная операция здесь моделируется простой задержкой.
А затем, вид:
public struct LoginScreen: View {
@ObjectBinding var loginObject = LoginModel()
public var body: some View {
Group {
if login.username == nil {
Text("Trying to login, please wait...")
} else {
Text("Successful login, the username is \(loginObject.username!)")
}
}.onAppear {
self.loginObject.load()
}
}
}
Существуют более эффективные способы "связывания" с модельным объектом, но мы, разумеется, рассмотрим здесь только голый пример.
Ваш NavigationButton
будет ссылаться только на LoginScreen, без какого-либо другого кода или триггера.
Первоначально на экране отобразится Trying to login, please wait...
, а через 5 секунд изменится на Successful login, the username is Sorin
. Очевидно, вы могли бы сойти с ума и заменить мой текст здесь, что вы можете.