iOS
Swift: de rootViewController in AppDelegate wijzigen om de hoofdstroom of login / onboarding-stroom weer te geven
Zoeken…
Invoering
Het is vaak handig om een nieuwe ervaring voor nieuwe gebruikers van uw app te presenteren. Dit kan om een aantal redenen zijn, zoals ze vragen zich aan te melden (indien nodig voor uw situatie), uitleggen hoe de app te gebruiken of ze gewoon informeren over nieuwe functies in een update (zoals Notes, Foto's en Muziek doen in iOS11).
Opmerkingen
Ten eerste, omdat u te maken heeft met meerdere stromen, kunnen Storyboards hier effectief worden gebruikt. Standaard gebruikt uw toepassing Main.storyboard
voor uw primaire stroom. Uw onboarding / alternatieve stroom kan worden opgenomen in een secundair storyboard, bijvoorbeeld. Onboarding.storyboard
Dit heeft een aantal voordelen:
- in een team van ontwikkelaars kan het werk aan elke gebruikersstroom worden gescheiden
- duidelijkere broncontrole (git)
- scheiding van zorgen
Wanneer uw app wordt gestart, kunt u bepalen welke stroom moet worden gepresenteerd. De logica hiervoor kan worden opgenomen in uw AppDelegate:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let isFirstRun = true // logic to determine goes here
if isFirstRun {
showOnboarding()
}
return true
}
Om de Onboarding-flow te laten zien, is het de moeite waard om te overwegen hoe je de ervaring van het ontslaan wilt verwerken zodra de persoon die het gebruikt de reis heeft voltooid, en die semantisch correct is voor wat je probeert te creëren.
benaderingen:
De twee belangrijkste benaderingen zijn:
- Wissel de rootweergavecontroller van het hoofdvenster van de app uit
- Presenteer de Onboarding-stroom als een modale reis, die de hoofdstroom overlapt.
De implementatie hiervan moet worden opgenomen in een uitbreiding van AppDelegate.
Optie 1: Swap de Root View Controller (goed)
Er zijn voordelen aan het schakelen van de UIViewAnimationOptions
controller, hoewel de overgangsopties beperkt zijn tot die ondersteund door UIViewAnimationOptions
, dus afhankelijk van hoe u wilt overschakelen tussen stromen, moet u wellicht een aangepaste overgang implementeren - wat omslachtig kan zijn.
U kunt de Onboarding-stroom weergeven door eenvoudig de UIApplication.shared.keyWindow.rootViewController
Ontslag wordt afgehandeld door UIView.transition(with:)
en de overgangsstijl door te geven als een UIViewAnimationOptions
, in dit geval Cross Dissolve. (Flips en krullen worden ook ondersteund).
Je moet ook het kader van de hoofdweergave instellen voordat je er weer naartoe gaat, omdat je het voor de eerste keer instantieert.
// MARK: - Onboarding
extension AppDelegate {
func showOnboarding() {
if let window = UIApplication.shared.keyWindow, let onboardingViewController = UIStoryboard(name: "Onboarding", bundle: nil).instantiateInitialViewController() as? OnboardingViewController {
onboardingViewController.delegate = self
window.rootViewController = onboardingViewController
}
}
func hideOnboarding() {
if let window = UIApplication.shared.keyWindow, let mainViewController = UIStoryboard(name: "Main", bundle: nil).instantiateInitialViewController() {
mainViewController.view.frame = window.bounds
UIView.transition(with: window, duration: 0.5, options: .transitionCrossDissolve, animations: {
window.rootViewController = mainViewController
}, completion: nil)
}
}
}
Optie 2: presenteer alternatieve stroom modaal (beter)
In de meest eenvoudige implementatie kan de Onboarding-stroom eenvoudig worden gepresenteerd in een modale context, omdat de gebruiker semantisch op een enkele reis is.
[Richtlijnen voor menselijke interface van Apple - Modaliteit] [1]:
Overweeg alleen een modale context te maken wanneer het van cruciaal belang is om iemands aandacht te trekken, wanneer een taak moet worden voltooid of verlaten om de app te blijven gebruiken of om belangrijke gegevens op te slaan.
Modaal presenteren maakt de eenvoudige optie van ontslag aan het einde van de reis mogelijk, met weinig van het ruilen van controllers.
Aangepaste overgangen worden ook op de standaard manier ondersteund, omdat dit de ViewController.present()
API gebruikt:
// MARK: - Onboarding
extension AppDelegate {
func showOnboarding() {
if let window = window, let onboardingViewController = UIStoryboard(name: "Onboarding", bundle: nil).instantiateInitialViewController() as? OnboardingViewController {
onboardingViewController.delegate = self
window.makeKeyAndVisible()
window.rootViewController?.present(onboardingViewController, animated: false, completion: nil)
}
}
func hideOnboarding() {
if let window = UIApplication.shared.keyWindow {
window.rootViewController?.dismiss(animated: true, completion: nil)
}
}
}