SwiftUI Journey Part 5: Sign In To Home View
On iOS, to transition from a SignInViewController
to HomeViewController
after the user successfully signs in, you just have to call the makeKeyAndVisible().
But on macOS using SwiftUI, here’s how I did it. It took me a while to get this right. And, still not entirely sure if this is the way.
Here’s what my sign in view looks like, some parts are removed obviously for security reasons. But the conditional logic is the same.
import SwiftUI
struct SignInView: View {
@State private var signInSuccess = false
var body: some View {
if signInSuccess {
HomeView()
else {
Text("I'm in sign in.").padding()
}
}
}
First of all, the concept of @State
is still foreign to me. It is both awesome and terrifying. Terrifying because it seems there are no lifecycles to follow and might cause some logic bugs in the future. This needs more serious study but in the meantime, signInSuccess
variable holds the state of whether the user successfully signs in or not.
Now, here’s my sign in function.
private func signIn() {
if !email.isEmpty && !password.isEmpty {
if let url = URL(string: Urls.main.authenticate) {
let session = URLSession.shared
var request = URLRequest(url: url)
request.httpMethod = "POST"
let body = "info[email]=\(email)&info[password]=\(password)"
request.httpBody = body.data(using: .utf8)
let task = session.dataTask(with: request) { [self]
data, response, error in
if let error = error {
print("Login error \(error)")
} else {
// No errors found
signInSuccess = true
}
}
task.resume()
}
}
}
By the time the variable signInSuccess
is set to true, SwiftUI will update the parts of the view heirarchy. That means the condition below will be triggered.
if signInSuccess {
HomeView()
}
It’s frustrating how few SwiftUI for macOS tutorials are out there. Anyway, that’s all for now.