これを達成する方法は多分多岐にわたりますが、過去にこのような状況を扱った方法の1つは、カスタムコンテナViewControllerを作成することです。このVCには独自のUIViewはありませんが、その代わりに他のViewControllerを「ビュー」として表示します。
ここには、このタイプのコントローラーを作成する方法が記載されているApple documentationへのリンクがあります。
このアーキテクチャの利点の1つは、自分のアカウントステータスに関連するイベント(ログインしていない、オフラインに達した、アカウントが中断している、最初にタイムアウトユーザ、ログアウトなど)。
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()
}
}
私は解決策を理解できるようにサンプルコードをお願いします。 – user2508528
まあまあです。スウィフトを手に入れましょう。 –