iOS
Swift: zmiana rootViewController w AppDelegate w celu przedstawienia przepływu głównego lub logowania / dołączania
Szukaj…
Wprowadzenie
Często przydatne jest zaprezentowanie pierwszego uruchomienia nowym użytkownikom aplikacji. Może to być z wielu powodów, takich jak monitowanie ich o zalogowanie się (jeśli jest to wymagane w danej sytuacji), wyjaśnianie, jak korzystać z aplikacji lub po prostu informowanie ich o nowych funkcjach w aktualizacji (tak jak robią to Notatki, Zdjęcia i Muzyka) iOS11).
Uwagi
Po pierwsze, ponieważ masz do czynienia z wieloma przepływami, tutaj możesz skutecznie używać Storyboardów. Domyślnie Twoja aplikacja używa Main.storyboard
do głównego przepływu. Twój onboarding / alternatywny przepływ może być zawarty w dodatkowej serii ujęć, np. Onboarding.storyboard
Ma to wiele zalet:
- w zespole programistów prace nad każdym przepływem użytkowników można rozdzielić
- wyraźniejsza kontrola źródła (git)
- rozdzielenie obaw
Po uruchomieniu aplikacji możesz określić, który przepływ powinien zostać przedstawiony. Logika tego może być zawarta w AppDelegate:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let isFirstRun = true // logic to determine goes here
if isFirstRun {
showOnboarding()
}
return true
}
Aby pokazać przebieg wdrażania, warto zastanowić się, w jaki sposób chciałbyś poradzić sobie z doświadczeniem zwalniania go, gdy osoba go wykorzystująca zakończy podróż, i które jest semantycznie poprawne do tego, co próbujesz stworzyć.
Podejścia:
Dwa główne podejścia to:
- Zamień kontroler widoku głównego w głównym oknie aplikacji
- Przedstaw przepływ Onboarding jako modalną podróż, pokrywającą się z przepływem głównym.
Implementacja tego powinna być zawarta w rozszerzeniu AppDelegate.
Opcja 1: Zamień kontroler widoku głównego (Dobrze)
Przełączanie kontrolera widoku głównego ma zalety, chociaż opcje przejścia są ograniczone do tych obsługiwanych przez UIViewAnimationOptions
, więc w zależności od tego, w jaki sposób chcesz przechodzić między przepływami, może to oznaczać konieczność implementacji niestandardowego przejścia - co może być kłopotliwe.
Możesz pokazać przepływ dołączania, po prostu ustawiając UIApplication.shared.keyWindow.rootViewController
Zwolnienie jest obsługiwane przez użycie UIView.transition(with:)
i przekazanie stylu przejścia jako UIViewAnimationOptions
, w tym przypadku Cross Dissolve. (Obsługiwane są również przewrotki i loki).
Musisz także ustawić ramkę widoku głównego przed powrotem do niego, gdy tworzysz go po raz pierwszy.
// 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)
}
}
}
Opcja 2: Prezentuj przepływ alternatywny modalnie (lepiej)
W najprostszej implementacji przepływ Onboarding można po prostu przedstawić w kontekście modalnym, ponieważ semantycznie użytkownik jest w jednej podróży.
[Wytyczne Apple Human Interface Interface - modalność] [1]:
Rozważ utworzenie kontekstu modalnego tylko wtedy, gdy jest to bardzo ważne, aby zwrócić na siebie uwagę, gdy zadanie musi zostać zakończone lub porzucone, aby kontynuować korzystanie z aplikacji lub zapisać ważne dane.
Prezentacja modalna pozwala na prostą opcję zwolnienia na koniec podróży, przy niewielkim nakładzie wymiany kontrolerów.
Niestandardowe przejścia są również obsługiwane w standardowy sposób, ponieważ korzysta z interfejsu API 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)
}
}
}