Push Presentation — vzor navigace v mobilních aplikacích, při kterém je každá nová obrazovka přidána do navigačního zásobníku nad předchozí. Uživatel může postupně přecházet vpřed obsahem a vracet se zpět pomocí systémového tlačítka nebo přejetí. Podle Apple Developer, 2025 je UINavigationController používán v 85% iOS aplikací jako hlavní navigační vzor. V Androidu je podobná funkcionalita realizována prostřednictvím FragmentManager a NavController z Navigation Component.
Hlavní body
Push Presentation — je mechanismus navigace, při kterém je každá nová obrazovka umístěna na vrchol zásobníku, zatímco předchozí obrazovka zůstává v paměti pod ní. Uživatel proniká hlouběji do obsahu postupným otevíráním detailních obrazovek a tlačítko zpět ho vrací na předchozí krok.
Architektura Push navigace je založena na datové struktuře LIFO (Last In, First Out). Nová obrazovka je vždy přidána na konec zásobníku a odebírá se pouze z vrcholu. To zaručuje předvídatelné chování: uživatel vždy ví, že tlačítko zpět ho vrátí přesně o jeden krok zpět. Navigační zásobník může obsahovat 2 až 10+ obrazovek v závislosti na složitosti aplikace.
Push Presentation je hlavní vzor v aplikacích s hierarchickým obsahem: zpravodajské kanály, katalogy produktů, víceúrovňová menu a dokumentace. Podle Material Design je zásobníková navigace vhodná pro scénáře, kde uživatel zkoumá obsah od obecného ke konkrétnímu a každá další obrazovka prohlubuje porozumění tématu.
Navigační zásobník — je uspořádaná sada obrazovek, kde každý prvek ukládá stav svého ViewController nebo Fragment. Během operace Push je nová obrazovka přidána do zásobníku, její zobrazení je animováno (posun z pravé strany v iOS, posun zdola nebo Fade v Androidu) a stává se aktivní.
Během operace Pop (stisknutí tlačítka zpět) je horní obrazovka odstraněna ze zásobníku, zničena nebo přejde do paměti a předchozí obrazovka se stává aktivní. iOS ve výchozím nastavení zničí popped ViewController a uvolní paměť. Android může uchovat Fragment v back stack s možností obnovení bez opětovného vytvoření.
Hloubka zásobníku ovlivňuje výkon: každá obrazovka v zásobníku spotřebovává paměť. Doporučuje se neukládat více než 10 obrazovek v zásobníku. Pro hlubokou navigaci použijte PopToRoot nebo restart zásobníku s novou root obrazovkou. Navigation Component v Androidu automaticky spravuje stav zásobníku prostřednictvím SavedStateHandle.
UINavigationController — kontejnerový kontroler iOS, který spravuje zásobník UIViewController. Automaticky zobrazuje navigační panel (navigation bar) s názvem aktuální obrazovky a tlačítkem zpět. Výchozí animace Push — posun zprava doleva, vytvářející u uživatele pocit ponoření do obsahu.
Přidání obrazovky se provádí pomocí pushViewController(_:animated:). Odebrání — pomocí popViewController(animated:). Pro návrat na root obrazovku se používá popToRootViewController(animated:). UINavigationController také podporuje programovou správu zásobníku prostřednictvím vlastnosti viewControllers — pole všech kontrolerů v zásobníku.
Navigační panel obsahuje název obrazovky (title), tlačítko zpět a volitelná tlačítka akcí. Od iOS 11 umožňují Large Titles (prefersLargeTitles) zobrazení názvu zvětšeným písmem, které se při rolování animovaně zmenšuje. To zlepšuje navigační hierarchii a informuje uživatele o aktuální sekci.
let detailVC = DetailViewController()
detailVC.title = "Item Details"
navigationController?.pushViewController(detailVC, animated: true)
// Návrat na předchozí obrazovku
navigationController?.popViewController(animated: true)
// Návrat na root obrazovku
navigationController?.popToRootViewController(animated: true)
Navigation Component — knihovna Android Jetpack pro deklarativní navigaci. Poskytuje NavController, který spravuje fragmenty nebo compose obrazovky prostřednictvím navigačního grafu (nav_graph). Push v Androidu je analogický iOS: každý nový Fragment je přidán do back stack a tlačítko zpět obnoví předchozí.
NavHost — kontejner, který zobrazuje aktuální cíl z NavGraph. NavGraph — XML soubor popisující všechny obrazovky aplikace a spojení mezi nimi. Přechody jsou definovány pomocí actions s uvedením destination a volitelných argumentů. Navigation Component automaticky zpracovává systémové tlačítko zpět, animace a ukládání stavu.
Pro přenos dat mezi obrazovkami Navigation Component podporuje Safe Args — generování kódu type-safe tříd argumentů. Místo ručního vkládání dat do Bundle vývojář deklaruje argumenty v NavGraph a přijímá je prostřednictvím generovaných tříd Directions a Args. Safe Args eliminuje chyby neshody typů a zjednodušuje refaktorování.
// Definice NavGraph v XML
<!-- res/navigation/nav_graph.xml -->
@navigation {
NavHost(startDestination = "list") {
composable("list") { ListScreen() }
composable(
"detail/{itemId}",
arguments = listOf(navArgument("itemId") { type = NavType.IntType })
) { DetailScreen(it.arguments()?.getInt("itemId") ?: 0) }
}
}
// Programová navigace
navController.navigate("detail/42")
Kombinace Bottom Navigation a Push navigace — častý vzor v mobilních aplikacích. Každá karta Bottom Navigation má vlastní zásobník obrazovek. Navigation Component to podporuje prostřednictvím NavHost per tab nebo jediného NavHost s oddělenými grafy pro každou kartu. Přepínání karet neresusuje stav zásobníků Push.
Push Presentation a Modal Presentation řeší různé úkoly navigace. Push je určen pro sekvenční prohlížení obsahu, kde každá nová obrazovka prohlubuje kontext. Modal — pro úkoly vyžadující soustředění a dokončení. V praxi je důležité zvolit správný vzor pro konkrétní scénář.
Hlavní kritéria výběru: pokud by se uživatel měl volně vracet bez ztráty kontextu — zvolte Push. Pokud je úkol dočasný a blokuje hlavní obsah (formulář, autorizace) — použijte Modal. Míchání vzorů na jedné obrazovce (Push uvnitř Modal) je povoleno, ale vyžaduje jasnou vizuální hierarchii.
Chybou je použití Modal pro sekvence obrazovek, které jsou logicky součástí hlavního toku. Například průvodce vytvořením objednávky (Krok 1 → Krok 2 → Krok 3) je lépe realizovat pomocí Push uvnitř modálního kontejneru než řetězcem modálních oken. To zachovává navigační hierarchii a předvídatelnost návratu.
Podívejme se na kompletní implementaci Push navigace na obou platformách. Příklad v Swift demonstruje UINavigationController s programovým řízením zásobníku a zpracováním hlubokých odkazů. Příklad v Kotlin ukazuje Navigation Component s NavHost, argumenty a animacemi.
class ListViewController: UIViewController {
func showDetail(_ itemId: Int) {
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let detailVC = storyboard.instantiateViewController(
withIdentifier: "DetailViewController"
) as! DetailViewController
detailVC.itemId = itemId
navigationController?.pushViewController(detailVC, animated: true)
}
}
class DetailViewController: UIViewController {
var itemId: Int = 0
override func viewDidLoad() {
super.viewDidLoad()
title = "Item #\(itemId)"
}
}
@Composable
fun PushNavigationApp() {
val navController = rememberNavController()
NavHost(navController = navController, startDestination = "list") {
composable("list") {
ListScreen(
onItemClick = { id -> navController.navigate("detail/$id") }
)
}
composable(
"detail/{itemId}",
arguments = listOf(navArgument("itemId") { type = NavType.IntType })
) { backStackEntry ->
val itemId = backStackEntry.arguments()?.getInt("itemId") ?: 0
DetailScreen(itemId = itemId, onBack = { navController.popBackStack() })
}
}
}
Příklady ukazují základní Push navigaci: seznam → podrobnosti. iOS používá storyboardy a UINavigationController s ručním předáváním dat. Android používá NavHost s type-safe argumenty a automatickou správou back stack. Oba přístupy podporují hluboké odkazy, vlastní animace a ukládání stavu při otočení.
Často kladené otázky
Push přidá obrazovku do zásobníku UINavigationController s tlačítkem zpět. Present otevře modální okno bez tlačítka zpět — uživatel ho musí explicitně zavřít. Push je vhodný pro sekvenční obsah, Present — pro úkoly vyžadující soustředění. V SwiftUI Push odpovídá NavigationLink a Present odpovídá .sheet.
Navigation Component poskytuje metody popBackStack do určitého bodu a popUpTo pro čištění zásobníku. Aby se zabránilo přetečení zásobníku, použijte popUpTo(startDestination) { inclusive = true } před navigate. To zaručuje, že zásobník neobsahuje více než 5–7 obrazovek současně.
Ano, kombinace Push a Modal je standardní vzor. Například: seznam → Push na podrobnosti → Modal pro autorizaci. Doporučuje se neumísťovat Push uvnitř Modal: modální okno by nemělo obsahovat zásobníkovou navigaci. Pokud je uvnitř modálního okna potřeba sekvence obrazovek — použijte Push uvnitř modálního kontejneru.
Deep Links v Push navigaci otevírají aplikaci na konkrétní obrazovce. iOS používá URL schémata a Universal Links s UINavigationController. Android používá Intent Filters s NavDeepLink. V obou případech systém analyzuje odkaz a vytvoří navigační zásobník k cílové obrazovce, přičemž zachová možnost návratu.
iOS používá standardní animaci posunu, kterou lze přizpůsobit prostřednictvím UINavigationControllerDelegate. Android Navigation Component podporuje vlastní animace pomocí XML zdrojů (slide_in_right, slide_out_left). Pro Compose použijte AnimatedNavHost s modifikátorem animateItemPlacement.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také