Как загрузить контроллер панели вкладок из вида входа в систему — Swift

Поэтому я сделал контроллер вида для входа пользователя с Parse. при входе пользователя в систему с помощью кнопки войти в систему, панель вкладок посмотреть контроллер нагрузки. Проблема в том, если пользователь открывает приложение, и он уже войти, я не хочу, чтобы он пошел, не введя свой логин. I want the signing view controller send him to tab bar view controller.

Начальный контроллер вида-контроллер вида панели вкладок, я пробовал много способов справиться с этой проблемой, но ничего не кажется хорошим.

Введите описание изображения здесь

ждем всех ваших мыслей.

1 ответ

  1. Существует, вероятно, много различных способов достичь этого, но один из способов, который я имел дело с этим типом ситуации в прошлом, заключается в создании пользовательского контейнера ViewController. Этот VC не имеет собственного UIView, но вместо этого представляет другие ViewControllers как свои «представления».

    Вот ссылка на некоторую документацию Apple, которая описывает создание контроллера этого типа.

    Одним из преимуществ этой архитектуры является то, что у меня всегда есть VC в области, которая может предпринять действия для перенаправления моего пользователя на основе событий, связанных с их статусом учетной записи (не вошел в систему, автономный предел достигнут, учетная запись приостановлена, первый пользователь, выход из системы и т.д.).

    EDIT: пример контроллера контейнера

    Вот пример реализации пользовательского контроллера контейнера. Я уверен, что есть несколько лучших способов сделать некоторые из функций, показанных здесь, но, надеюсь, это даст вам хорошее начало.

    import UIKit
    
    class ApplicationContainerController: UIViewController {
        //MARK: - View Controller Routing Properties
        private var _currentClientView:UIView? = nil
        private var _currentViewController: UIViewController? = nil
    
    
        //MARK: - Initialization
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
        }
    
        //MARK: - UIViewController Members
        override func viewDidLoad() {
            super.viewDidLoad()
    
        }
    
        override var shouldAutomaticallyForwardAppearanceMethods : Bool {
            return true
        }
    
        override func viewWillAppear(_ animated: Bool) {
    
            //Get the user and route to the appropriate VC
            let yourUserObject: AnyObject? = YourDataSource.TryToGetAUser()
            DispatchQueue.main.async {
                self.routeUser(yourUserObject)
            }
    
        }
    
        //MARK: - Your Custom Routing Logic
        func routeUser(_ yourUserObject: AnyObject?) {
    
            //make sure we have an existing user, or else we send them to login
            guard let user = yourUserObject
                else {
                    self.displayContentController(YourLoginViewController())
                    return
            }
    
            var destinationViewController:UIViewController
    
            //please use an enum or something (instead of strings) in your code
            switch user.signInStatus {
                case "loginActive":
                    let mainMenuViewController = YourMainMenuViewController()
                    mainMenuViewController.user = user
                    destinationViewController = mainMenuViewController
                case "firstLogin":
                    let firstLoginViewController = YourFirstLoginViewController()
                    firstLoginViewController.user = user
                    destinationViewController = firstLoginViewController
                case "giveUsMoney":
                    let weWantMoneyViewController = YourOtherViewController()
                    weWantMoneyViewController.user = user
                    destinationViewController = weWantMoneyViewController
                default:
                    //loginFailed or some other status we don't know how to handle
                    destinationViewController = YourLoginViewController()
            }
    
    
            if let activeViewController = self._currentViewController,
                type(of: activeViewController) !== type(of: destinationViewController) {
                //we have an active viewController that is not the destination, cycle
                self.cycleFromCurrentViewControllerToViewController(destinationViewController)
            } else {
                //no active viewControllers
                self.displayContentController(destinationViewController)
            }
    
    
        }
    
    
    
        //MARK: - Custom Content Controller Routing Methods
        private func frameForContentController() -> CGRect {
            return self.view.frame
        }
    
        private func newViewStartFrame() -> CGRect {
            return CGRect(x: self.view.frame.origin.x,
                          y: self.view.frame.origin.y + self.view.frame.size.width,
                          width: self.view.frame.size.width,
                          height: self.view.frame.size.height)
        }
    
        private func oldViewEndFrame() -> CGRect {
            return CGRect(x: self.view.frame.origin.x,
                          y: self.view.frame.origin.y - self.view.frame.size.width,
                          width: self.view.frame.size.width,
                          height: self.view.frame.size.height)
        }
    
    
        /**
         Transitions viewControllers, adds-to/removes-from context, and animates views on/off screen.
         */
        private func cycleFromCurrentViewControllerToViewController(_ newViewController: UIViewController) {
            if let currentViewController = self._currentViewController {
                self.cycleFromViewController(currentViewController, toViewController: newViewController)
            }
        }
    
        private func cycleFromViewController(_ oldViewController:UIViewController, toViewController newViewController:UIViewController) {
    
            let endFrame = self.oldViewEndFrame()
    
            oldViewController.willMove(toParentViewController: nil)
            self.addChildViewController(newViewController)
            newViewController.view.frame = self.newViewStartFrame()
    
            self.transition(from: oldViewController, to: newViewController,
                            duration: 0.5,
                            options: [],
                            animations: { () -> Void in
                                newViewController.view.frame = oldViewController.view.frame
                                oldViewController.view.frame = endFrame
            }) { (finished:Bool) -> Void in
                self.hideContentController(oldViewController)
                self.displayContentController(newViewController)
            }
        }
    
    
        /**
            Adds a view controller to the hierarchy and displays its view
        */
        private func displayContentController(_ contentController: UIViewController) {
            self.addChildViewController(contentController)
            contentController.view.frame = self.frameForContentController()
            self._currentClientView = contentController.view
            self.view.addSubview(self._currentClientView!)
            self._currentViewController = contentController
            contentController.didMove(toParentViewController: self)
    
        }
    
        /**
         Removes a previously added view controller from the hierarchy
        */
        private func hideContentController(_ contentController: UIViewController) {
            contentController.willMove(toParentViewController: nil)
            if (self._currentViewController == contentController) {
                self._currentViewController = nil
            }
            contentController.view.removeFromSuperview()
            contentController.removeFromParentViewController()
    
        }
    
    }