Push Presentation — un model de navigare în aplicațiile mobile, în care fiecare ecran nou este adăugat în stiva de navigare deasupra celui anterior. Utilizatorul poate naviga secvențial înainte prin conținut și se poate întoarce înapoi prin butonul sistem sau prin glisare. Potrivit Apple Developer, 2025, UINavigationController este utilizat în 85% din aplicațiile iOS ca model principal de navigare. În Android, funcționalitatea similară este realizată prin FragmentManager și NavController din Navigation Component.
Principalele puncte
Push Presentation — este un mecanism de navigare în care fiecare ecran nou este plasat în vârful stivei, iar ecranul anterior rămâne în memorie sub el. Utilizatorul pătrunde în profunzimea conținutului, deschizând succesiv ecrane detaliate, iar butonul înapoi îl readuce la pasul anterior.
Arhitectura navigării Push se bazează pe structura de date LIFO (Last In, First Out). Ecranul nou este întotdeauna adăugat la sfârșitul stivei, iar eliminarea are loc doar din vârf. Aceasta garantează un comportament previzibil: utilizatorul știe întotdeauna că butonul înapoi îl va readuce exact cu un pas înapoi. Stiva de navigare poate conține între 2 și 10+ ecrane, în funcție de complexitatea aplicației.
Push Presentation este modelul principal în aplicațiile cu conținut ierarhic: fluxuri de știri, cataloage de produse, meniuri pe mai multe niveluri și documentație. Conform Material Design, navigarea în stivă este potrivită pentru scenarii în care utilizatorul explorează conținutul de la general la particular, iar fiecare ecran următor aprofundează înțelegerea subiectului.
Stiva de navigare — este un set ordonat de ecrane, în care fiecare element stochează starea ViewController-ului sau Fragment-ului său. În timpul operației Push, ecranul nou este adăugat în stivă, afișarea sa este animată (glisare din dreapta în iOS, glisare de jos sau Fade în Android) și devine activ.
În timpul operației Pop (apăsarea înapoi), ecranul de sus este eliminat din stivă, este distrus sau trece în memorie, iar ecranul anterior devine activ. iOS distruge implicit ViewController-ul eliminat, eliberând memoria. Android poate păstra Fragment-ul în back stack cu posibilitatea de restaurare fără recreere.
Adâncimea stivei afectează performanța: fiecare ecran din stivă consumă memorie. Se recomandă să nu stocați mai mult de 10 ecrane în stivă. Pentru navigare profundă, utilizați PopToRoot sau repornirea stivei cu un nou ecran rădăcină. Navigation Component în Android gestionează automat starea stivei prin SavedStateHandle.
UINavigationController — un controler container iOS care gestionează stiva UIViewController. Acesta afișează automat bara de navigare (navigation bar) cu titlul ecranului curent și butonul de revenire. Animația implicită Push — glisare de la dreapta la stânga, creând utilizatorului senzația de imersiune în conținut.
Adăugarea ecranului se face prin pushViewController(_:animated:). Eliminarea — prin popViewController(animated:). Pentru revenirea la ecranul rădăcină se utilizează popToRootViewController(animated:). UINavigationController suportă, de asemenea, gestionarea programatică a stivei prin proprietatea viewControllers — un tablou al tuturor controlerelor din stivă.
Bara de navigare conține titlul ecranului (title), butonul înapoi și butoane opționale de acțiune. Începând cu iOS 11, Large Titles (prefersLargeTitles) permit afișarea titlului cu un font mărit, care se micșorează animat la derulare. Aceasta îmbunătățește ierarhia de navigare și informează utilizatorul despre secțiunea curentă.
let detailVC = DetailViewController()
detailVC.title = "Item Details"
navigationController?.pushViewController(detailVC, animated: true)
// Revenire la ecranul anterior
navigationController?.popViewController(animated: true)
// Revenire la ecranul rădăcină
navigationController?.popToRootViewController(animated: true)
Navigation Component — biblioteca Android Jetpack pentru navigare declarativă. Oferă NavController, care gestionează fragmentele sau ecranele Compose printr-un graf de navigare (nav_graph). Push în Android este analog cu iOS: fiecare Fragment nou este adăugat în back stack, iar butonul înapoi îl readuce pe cel anterior.
NavHost — un container care afișează destinația curentă din NavGraph. NavGraph — un fișier XML care descrie toate ecranele aplicației și conexiunile dintre ele. Tranzițiile sunt definite prin actions cu specificarea destination și a argumentelor opționale. Navigation Component gestionează automat butonul înapoi de sistem, animațiile și salvarea stării.
Pentru transmiterea datelor între ecrane, Navigation Component suportă Safe Args — generarea de cod a claselor de argumente type-safe. În loc să plaseze manual datele în Bundle, dezvoltatorul declară argumentele în NavGraph și le primește prin clasele generate Directions și Args. Safe Args elimină erorile de nepotrivire a tipurilor și simplifică refactorizarea.
// Definiția NavGraph în 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) }
}
}
// Navigare programatică
navController.navigate("detail/42")
Combinarea Bottom Navigation cu navigarea Push — un model frecvent în aplicațiile mobile. Fiecare filă Bottom Navigation are propria stivă de ecrane. Navigation Component suportă aceasta prin NavHost per tab sau un singur NavHost cu grafuri separate pentru fiecare filă. Comutarea filelor nu resetează starea stivelor Push.
Push Presentation și Modal Presentation rezolvă sarcini diferite de navigare. Push este destinat vizualizării secvențiale a conținutului, unde fiecare ecran nou aprofundează contextul. Modal — pentru sarcini care necesită concentrare și finalizare. În practică, este important să alegeți modelul potrivit pentru scenariul specific.
Criteriile principale de selecție: dacă utilizatorul trebuie să revină liber fără a pierde contextul — alegeți Push. Dacă sarcina este temporară și blochează conținutul principal (formular, autentificare) — utilizați Modal. Amestecarea modelelor pe același ecran (Push în interiorul Modal) este permisă, dar necesită o ierarhie vizuală clară.
Este o greșeală să utilizați Modal pentru secvențe de ecrane care fac parte logic din fluxul principal. De exemplu, asistentul de creare a comenzii (Pasul 1 → Pasul 2 → Pasul 3) este mai bine realizat prin Push în interiorul unui container modal, decât printr-un lanț de ferestre modale. Aceasta păstrează ierarhia de navigare și predictibilitatea revenirii.
Să analizăm implementarea completă a navigării Push pe ambele platforme. Exemplul în Swift demonstrează UINavigationController cu gestionare programatică a stivei și procesarea linkurilor profunde. Exemplul în Kotlin arată Navigation Component cu NavHost, argumente și animații.
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() })
}
}
}
Exemplele arată navigarea Push de bază: listă → detalii. iOS utilizează storyboard-uri și UINavigationController cu transmiterea manuală a datelor. Android utilizează NavHost cu argumente type-safe și gestionarea automată a back stack. Ambele abordări suportă linkuri profunde, animații personalizate și salvarea stării la rotire.
Întrebări frecvente
Push adaugă ecranul în stiva UINavigationController cu buton de revenire. Present deschide o fereastră modală fără buton înapoi — utilizatorul trebuie să o închidă explicit. Push este potrivit pentru conținut secvențial, Present — pentru sarcini care necesită concentrare. În SwiftUI, Push corespunde lui NavigationLink, iar Present — lui .sheet.
Navigation Component oferă metodele popBackStack până la un punct specificat și popUpTo pentru curățarea stivei. Pentru a preveni revărsarea stivei, utilizați popUpTo(startDestination) { inclusive = true } înainte de navigate. Aceasta garantează că stiva nu conține mai mult de 5–7 ecrane simultan.
Da, combinația Push și Modal este un model standard. De exemplu, listă → Push la detalii → Modal pentru autentificare. Se recomandă să nu plasați Push în interiorul Modal: fereastra modală nu ar trebui să conțină navigare în stivă. Dacă în interiorul ferestrei modale este necesară o secvență de ecrane — utilizați Push în interiorul containerului modal.
Deep Links în navigarea Push deschid aplicația pe un ecran specific. iOS utilizează scheme URL și Universal Links cu UINavigationController. Android utilizează Intent Filters cu NavDeepLink. În ambele cazuri, sistemul analizează linkul și creează o stivă de navigare până la ecranul țintă, păstrând posibilitatea de a reveni înapoi.
iOS utilizează animația standard de glisare, care poate fi personalizată prin UINavigationControllerDelegate. Android Navigation Component suportă animații personalizate prin resurse XML (slide_in_right, slide_out_left). Pentru Compose, utilizați AnimatedNavHost cu modificatorul animateItemPlacement.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și