Настройка корневого контроллера при запуске в зависимости от состояния авторизации пользователя - PullRequest
0 голосов
/ 26 октября 2019

Это макет раскадровки, который у меня есть сейчас

enter image description here

Итак, мне нужно проверить, прошел ли аутентификация пользователя уже при запуске приложения,Если он не вошел в систему, установите контроллер корневого представления для контроллера навигации с формами входа и регистрации. Если он вошел в систему, установите его в контроллер представления панели вкладок.

Я пробовал много разных решений, но ни одно из них не сработало. Он просто продолжал устанавливать контроллер представления на тот, который помечен как «Is Initial View Controller».

Это код, который я пробовал в AppDelegate:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    FirebaseApp.configure()

    self.window = UIWindow(frame: UIScreen.main.bounds)

    let storyboard = UIStoryboard.init(name: "Main", bundle: nil)

    var viewController: UIViewController

    if isAuthenticated() {
        viewController = storyboard.instantiateViewController(withIdentifier: Constants.Storyboards.homeViewController) as! UITabBarController
    } else {
        viewController = storyboard.instantiateViewController(withIdentifier: Constants.Storyboards.authViewController) as! UINavigationController
    }

    self.window?.rootViewController = viewController
    self.window?.makeKeyAndVisible()

    return true
}

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

РЕДАКТИРОВАТЬ: Благодаря @LukaCefarin и @Francesco Deliro мне удалось выяснить, в чем проблема. Я использовал XCode 11, и rootViewController должен был быть установлен в SceneDelegate.swift

Вот как мой код в SceneDelegate.swift выглядит для всех, у кого есть похожая проблема:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

    guard let _ = (scene as? UIWindowScene) else { return }

    self.window =  UIWindow(windowScene: scene as! UIWindowScene)

    let storyboard = UIStoryboard.init(name: "Main", bundle: nil)

    var viewController: UIViewController;

    if isAuthenticated() {
        viewController = storyboard.instantiateViewController(withIdentifier: "HomeVC")
    } else {
        viewController = storyboard.instantiateViewController(withIdentifier: "AuthVC")
    }

    self.window?.rootViewController = viewController
    self.window?.makeKeyAndVisible()

}

1 Ответ

1 голос
/ 26 октября 2019

РЕДАКТИРОВАТЬ:

Это решение и настройка окна rootViewController в AppDelegate работают для версий до Xcode11 и iOS13. Как предложено в комментариях Луки Чефарина, если вы используете Xcode11 и iOS13, вам нужно установить окно rootViewController в файле SceneDelegate.swift.

Вы должны удалить основной интерфейс и снять флажок с начального контроллера представленияв раскадровке:

До

enter image description here

После

enter image description here

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