Last active
March 29, 2017 13:57
-
-
Save stephen-francis/766b185aa93550622ab540ee78f1db26 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| public enum OnboardingState: Int { | |
| case notStarted | |
| case addLocations | |
| case addStops | |
| case preferences | |
| case finished | |
| func storyboardIdentifier() -> String { | |
| switch self { | |
| case .notStarted: | |
| return "Onboarding-Welcome" | |
| case .addLocations: | |
| return "Onboarding-AddLocation" | |
| case .addStops: | |
| return "Onboarding-AddStop" | |
| case .preferences: | |
| return "Onboarding-Preferences" | |
| case .finished: | |
| return "CommuteViewController" | |
| } | |
| } | |
| } | |
| class OnboardingController { | |
| var onboardingState: OnboardingState? { | |
| get { | |
| guard let state = UserDefaults.onboardingState() else { return .notStarted } | |
| return state | |
| } | |
| set { | |
| // if new state is nil, don't put that in UserDefaults | |
| guard let state = newValue else { return } | |
| UserDefaults.setOnboardingState(state) | |
| updateWindow(forOnboardingState: state) | |
| if state == .finished { | |
| completeOnboarding() // maybe we could have a delegate call or invoke a completion block here | |
| } | |
| } | |
| } | |
| func completeOnboarding() { | |
| // do the things we want to do when onboarding is complete (navigate to main app, etc.) | |
| } | |
| func updateWindow(forOnboardingState state: OnboardingState) { | |
| let storyboardIdentifier = state.storyboardIdentifier() | |
| let currentViewController = UIStoryboard(name: "Onboarding", bundle: nil).instantiateViewController(withIdentifier: storyboardIdentifier) | |
| update(with: currentViewController) | |
| } | |
| func update(with currentViewController: UIViewController) { | |
| // using your method of choice, make this the active view controller | |
| // that's another whole post in of itself! | |
| } | |
| } | |
| extension UserDefaults { | |
| class func setOnboardingState(_ state: OnboardingState) { | |
| let stateNumber = NSNumber(value: state.rawValue) | |
| UserDefaults.standard.set(stateNumber, forKey: "onboardingState") | |
| } | |
| class func onboardingState() -> OnboardingState? { | |
| guard let stateNumber = UserDefaults.standard.value(forKey: CommuteConstants.onboardingState.rawValue) as? NSNumber else { return nil } | |
| return OnboardingState(rawValue: stateNumber.intValue) | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment