После успешной регистрации перейдите к основному приложению. Следует ли использовать SceneDelegate? - PullRequest
0 голосов
/ 15 апреля 2020

Я новичок в разработке для мобильных устройств с использованием Xcode (xcode 11.4 с Swift 4) и в настоящее время изучаю, как создать страницу аутентификации, которая в случае успеха переходит на MainViewController.

Мой эскиз доски истории выглядит следующим образом: enter image description here

Где верхний ряд - 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, и существует «один правильный путь». Пожалуйста, объясните.

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Вы можете создать Segue между вашим ConfirmationViewController и вашим MainViewController в раскадровке, а затем вы можете использовать:

performSegue(withIdentifier: "segueIdentifier", sender: self).

Или вы можете использовать:

_ = navigationController?.popViewController(animated: true)

Если вы хотите go назад к root контроллеру представления

_ = navigationController?.popToRootViewController(animated: true)
0 голосов
/ 15 апреля 2020

Во-первых, извините, мой engli sh (я пытаюсь это узнать).

Недавно я реализовал AWS вход в проект SwiftUI. И, следуя рекомендациям Apple (не выполняйте процесс во время запуска приложения), уникальное решение, которое я основал, заключалось в том, чтобы в моем приложении сначала открывался экран входа в систему без элементов - все элементы с непрозрачностью ноль.

Затем после отображения экрана входа в систему я проверяю статус AWS, чтобы показать дом или останавливаюсь на экране входа в систему.

Я надеюсь помочь вам (я пробовал: P).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...