Вам понадобится NavigationView
и NavigationLink
для достижения того, что вы ищете.
NavigationView
обернет все внутренние виды в контроллере навигации, а NavigationLink
подобен специальной кнопке, которая запускает навигацию.
Пример:
struct ContentView: View {
@State private var email: String = "root"
@State private var password: String = "toor"
@State private var isLoginValid: Bool = false
@State private var shouldShowLoginAlert: Bool = false
var body: some View {
NavigationView {
VStack(alignment: .center) {
TextField("email", text: self.$email)
TextField("password", text: self.$password)
NavigationLink(destination: Text("Success"),
isActive: self.$isLoginValid) {
/*
Here we put the content view of `NavigationLink`.
It could be any `View` even `Button` but in this
example we use a `Text` with `onTapGesture`.
*/
Text("Login")
.onTapGesture {
//determine login validity
let isLoginValid = self.email == "root" && self.password == "toor"
//trigger logic
if isLoginValid {
self.isLoginValid = true //trigger NavigationLink
}
else {
self.shouldShowLoginAlert = true //trigger Alert
}
}
}
}
.navigationBarTitle("Login Screen")
.alert(isPresented: $shouldShowLoginAlert) {
Alert(title: Text("Email/Password incorrect"))
}
}
}
}
NavigationLink
определяет:
-
destination
, который переходит к простому Text
представлению - В вашем случае вы должны изменить его на
NextMyView()
isActive
, привязанное к логическому значению loginSuccess
, который при обновлении до true
должен повторно визуализировать представление и вызвать автоматический запуск NavigationLink
- Представление содержимого - это простое
Text
с onTapGesture
, в котором мы можем реализовать успех / обработка ошибок. - В вашем случае вы можете изменить
Text
на Image(systemName: "heart.fill")
PS: В качестве дополнительного я включил лог c для запуска и показать предупреждение при сбое входа в систему.
Надеюсь, это поможет:)