Я новичок в разработке для мобильных устройств с использованием Xcode (xcode 11.4 с Swift 4) и в настоящее время изучаю, как создать страницу аутентификации, которая в случае успеха переходит на MainViewController
.
Мой эскиз доски истории выглядит следующим образом:
Где верхний ряд - LoginViewController
, переходящий в ConfirmationViewController
. Нижний ряд - это MainViewController
приложения, доступного после того, как пользователь создал учетную запись.
В моем SceneDelegate.swift
я установил точку входа на LoginViewController
, если пользователь не вошел в систему, в противном случае точка входа - MainViewController
. Фрагмент кода здесь:
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
guard let windowScene = (scene as? UIWindowScene) else { return }
// initialize application window and scenes
self.window = UIWindow(windowScene: windowScene)
let errorViewController = UIStoryboard(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "ErrorPage")
let tabViewController = UIStoryboard(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "Tab" )
let signUpController = UIStoryboard(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "SignUp")
// initialize storyboard entry point
AWSMobileClient.default().initialize { (userState, error) in
if let userState = userState {
print("userState: \(userState)")
switch (userState) {
case .guest:
print("user is in guest mode.")
self.window?.rootViewController = signUpController
case .signedOut:
print("user signed out")
self.window?.rootViewController = signUpController
case .signedIn:
print("user is signed in")
self.window?.rootViewController = tabViewController
case .signedOutUserPoolsTokenInvalid:
print("need to login again.")
self.window?.rootViewController = signUpController
case .signedOutFederatedTokensInvalid:
print("user logged in via federation, but currently needs new tokens")
self.window?.rootViewController = signUpController
default:
print("unsupported")
}
} else if let error = error {
print("error: AWSMobileClient failed to load user \(error)")
self.window?.rootViewController = errorViewController
}
}
}
Работает как задумано. Теперь в моем ConfirmationViewController
мне нужно иметь логи c, которые направляют пользователя к основному приложению MainViewController
при успешном подтверждении
@IBAction func onPressConfirmEmail(_ sender: UIButton) {
// @use: on confirmation success, navigate to application main
// @error: show error in the same page and ask person to try again
}
}
Проблема в том, что я ' Я не уверен, что это «правильный» способ сделать это. Способ, которым Xcode настроил проект, выглядит весьма специфичным c, и существует «один правильный путь». Пожалуйста, объясните.