iOS
Swift: изменение rootViewController в AppDelegate для представления основного или входного / входного потока
Поиск…
Вступление
Часто бывает полезно представить первый опыт для новых пользователей вашего приложения. Это может быть по каким-либо причинам, например, побудить их войти (если это требуется для вашей ситуации), объяснить, как использовать приложение, или просто информировать их о новых функциях в обновлении (как отмечает Notes, Photos и Music в iOS11).
замечания
Во-первых, поскольку вы имеете дело с несколькими потоками, здесь можно эффективно использовать раскадровки. По умолчанию ваше приложение использует Main.storyboard
для вашего основного потока. Ваш бортовой / альтернативный поток может содержаться во вторичной раскадровке, например. Onboarding.storyboard
Это имеет ряд преимуществ:
- в команде разработчиков, работа над каждым потоком пользователя может быть отделена
- более четкое управление исходным кодом (git)
- разделение проблем
Когда приложение запускается, вы можете определить, какой поток должен быть представлен. Логика для этого может содержаться в вашем AppDelegate:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
let isFirstRun = true // logic to determine goes here
if isFirstRun {
showOnboarding()
}
return true
}
Чтобы показать поток Onboarding, стоит подумать о том, как вы хотите справиться с опытом увольнения, как только человек, использующий его, завершил путешествие и который семантически корректен для того, что вы пытаетесь создать.
подходы:
Двумя основными подходами являются:
- Поменяйте контроллер корневого представления главного окна приложения
- Представьте поток бортового потока как модальное путешествие, перекрывающее основной поток.
Реализация этого должна содержаться в расширении AppDelegate.
Вариант 1: обменять контроллер корневого представления (хорошо)
Есть преимущества для переключения контроллера корневого представления, хотя параметры перехода ограничены теми, которые поддерживаются UIViewAnimationOptions
, поэтому в зависимости от того, как вы хотите переходить между потоками, может означать, что вы должны реализовать пользовательский переход, который может быть громоздким.
Вы можете показать поток Onboarding, просто установив UIApplication.shared.keyWindow.rootViewController
Увольнение обрабатывается путем использования UIView.transition(with:)
и перехода стиля перехода как UIViewAnimationOptions
, в этом случае Cross Dissolve. (Флип и завитки также поддерживаются).
Вы также должны установить кадр Main view перед тем, как перейти к нему, поскольку вы создаете его впервые.
// 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)
}
}
}
Вариант 2: Существующий альтернативный поток (лучше)
В самой простой реализации поток Onboarding может быть просто представлен в модальном контексте, поскольку семантически Пользователь находится в одном путешествии.
[Руководство Apple по интерфейсу пользователя - модальность] [1]:
Рассмотрите возможность создания модального контекста только тогда, когда важно привлечь внимание кого-либо, когда задача должна быть завершена или оставлена для продолжения использования приложения или для сохранения важных данных.
Представление модально позволяет простой вариант увольнения в конце путешествия, с небольшим количеством крутизны переключающих контроллеров.
Пользовательские переходы также поддерживаются стандартным образом, поскольку для этого используется 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)
}
}
}