iOS
Swift: Ändra rootViewController i AppDelegate för att presentera huvud- eller inloggnings- / ombordningsflöde
Sök…
Introduktion
Det är ofta användbart att presentera en första upplevelse för nya användare av din app. Detta kan vara av flera orsaker, till exempel att be dem att logga in (om det behövs för din situation), förklara hur man använder appen eller helt enkelt informera dem om nya funktioner i en uppdatering (som anteckningar, foton och musik gör i iOS11).
Anmärkningar
För det första, när du har att göra med flera flöden, är det här Storyboards kan användas effektivt. Som standard använder din applikation Main.storyboard
för ditt primära flöde. Din onboarding / alternativa flöde kan finnas i en sekundär storyboard, t.ex. Onboarding.storyboard
Detta har ett antal fördelar:
- i ett team av utvecklare kan arbetet med varje användarflöde separeras
- tydligare källkontroll (git)
- dela upp problemen
När din app startas kan du bestämma vilket flöde som ska presenteras. Logiken för detta kan finnas i ditt AppDelegate:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let isFirstRun = true // logic to determine goes here
if isFirstRun {
showOnboarding()
}
return true
}
För att visa flödet Onboarding är det värt att överväga hur du vill hantera upplevelsen av att avföra den när personen som använder den har slutfört resan, och som är semantiskt korrekt för det du försöker skapa.
Approaches:
De två huvudsakliga strategierna är:
- Byt rotvynskontrollern i appens huvudfönster
- Presentera Onboarding-flödet som en modal resa och överlappar huvudflödet.
Implementeringen av detta bör ingå i en anknytning till AppDelegate.
Alternativ 1: Byta Root View Controller (Bra)
Det finns fördelar med att byta rotvykontroller, även om övergångsalternativen är begränsade till de som stöds av UIViewAnimationOptions
, så beroende på hur du vill överföra mellan flöden kan det innebära att du måste implementera en anpassad övergång - vilket kan vara besvärligt.
Du kan visa Onboarding-flödet genom att bara ange UIApplication.shared.keyWindow.rootViewController
Avskedande hanteras genom att använda UIView.transition(with:)
och skicka övergångsstilen som en UIViewAnimationOptions
, i detta fall Cross Dissolve. (Flips och Curls stöds också).
Du måste också ställa in ramen för huvudvyn innan du går tillbaka till den, eftersom du instanserar den för första gången.
// 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)
}
}
}
Alternativ 2: presentera alternativt flöde modellt (bättre)
I den mest enkla implementeringen kan Onboarding-flödet helt enkelt presenteras i ett modalt sammanhang eftersom användaren är semantiskt på en enda resa.
[Apples riktlinjer för mänskligt gränssnitt - Modalitet] [1]:
Överväg att skapa ett modalt sammanhang endast när det är viktigt att få någon uppmärksamhet, när en uppgift måste slutföras eller överges för att fortsätta använda appen eller för att spara viktig information.
Att presentera modellt möjliggör det enkla alternativet att avskedas i slutet av resan, med lite av inslaget av byta kontroller.
Anpassade övergångar stöds också på vanligt sätt, eftersom detta använder API: n ViewController.present()
:
// 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)
}
}
}