Skip to content

Instantly share code, notes, and snippets.

@stephen-francis
Last active March 29, 2017 13:57
Show Gist options
  • Select an option

  • Save stephen-francis/766b185aa93550622ab540ee78f1db26 to your computer and use it in GitHub Desktop.

Select an option

Save stephen-francis/766b185aa93550622ab540ee78f1db26 to your computer and use it in GitHub Desktop.
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