Push Presentation в мобилната разработка: какво е, стек от екрани

Автор: IT Sectr Публикувано: 2026-06-09 Време за четене: 5 мин

Push Presentation — модел на навигация в мобилни приложения, при който всеки нов екран се добавя в стека за навигация над предишния. Потребителят може последователно да преминава напред през съдържанието и да се връща назад чрез системния бутон или плъзгане. Според Apple Developer, 2025, UINavigationController се използва в 85% от iOS приложенията като основен навигационен модел. В Android подобна функционалност се реализира чрез FragmentManager и NavController от Navigation Component.

Основни точки

  • Push Presentation — добавяне на екран в навигационния стек с автоматичен бутон за връщане към предишния екран.
  • UINavigationController в iOS управлява стека от UIViewController чрез методите pushViewController и popViewController.
  • Android Navigation Component използва NavController с NavHost и навигационни графи в XML или Compose формат.
  • Стекова навигация запазва историята на преходите, позволявайки на потребителя да се върне на всеки предишен екран.
  • Deep linking в Push навигацията се поддържа чрез обработка на Intent и NavDeepLink в Android и URL схеми в iOS.

Какво е Push Presentation?

Push Presentation — е механизъм за навигация, при който всеки нов екран се поставя на върха на стека, а предишният екран остава в паметта под него. Потребителят навлиза по-дълбоко в съдържанието, последователно отваряйки детайлни екрани, а бутонът назад го връща към предишната стъпка.

Архитектурата на Push навигацията се основава на структурата от данни LIFO (Last In, First Out). Новият екран винаги се добавя в края на стека, а премахването става само от върха. Това гарантира предвидимо поведение: потребителят винаги знае, че бутонът назад ще го върне точно една стъпка назад. Навигационният стек може да съдържа от 2 до 10+ екрана в зависимост от сложността на приложението.

Push Presentation е основният модел в приложения с йерархично съдържание: новинарски емисии, каталози с продукти, многостепенни менюта и документация. Според Material Design, стековата навигация е подходяща за сценарии, при които потребителят изследва съдържание от общо към частно, а всеки следващ екран задълбочава разбирането на темата.

Навигационният стек — е подреден набор от екрани, където всеки елемент съхранява състоянието на своя ViewController или Fragment. По време на Push операция новият екран се добавя към стека, показването му се анимира (плъзгане отдясно в iOS, плъзгане отдолу или Fade в Android) и става активен.

По време на Pop операция (натискане назад) горният екран се премахва от стека, унищожава се или отива в паметта, а предишният екран става активен. iOS по подразбиране унищожава popped ViewController, освобождавайки памет. Android може да запази Fragment в back stack с възможност за възстановяване без повторно създаване.

Дълбочината на стека влияе върху производителността: всеки екран в стека консумира памет. Препоръчва се да не съхранявате повече от 10 екрана в стека. За дълбока навигация използвайте PopToRoot или рестартиране на стека с нов root екран. Navigation Component в Android автоматично управлява състоянието на стека чрез SavedStateHandle.

Push навигация в iOS: UINavigationController

UINavigationController — контейнерен контролер в iOS, който управлява стека от UIViewController. Той автоматично показва навигационната лента (navigation bar) със заглавието на текущия екран и бутон за връщане. Анимацията по подразбиране на Push — плъзгане от дясно на ляво, създаващо у потребителя усещане за потапяне в съдържанието.

Управление на стека

Добавянето на екран се извършва чрез pushViewController(_:animated:). Премахването — чрез popViewController(animated:). За връщане към root екрана се използва popToRootViewController(animated:). UINavigationController също поддържа програмно управление на стека чрез свойството viewControllers — масив от всички контролери в стека.

Navigation Bar и Large Titles

Навигационната лента съдържа заглавието на екрана (title), бутон назад и опционални бутони за действия. От iOS 11, Large Titles (prefersLargeTitles) позволяват показване на заглавието с увеличен шрифт, който анимирано се свива при скролване. Това подобрява навигационната йерархия и информира потребителя за текущата секция.

swift
let detailVC = DetailViewController()
detailVC.title = "Item Details"
navigationController?.pushViewController(detailVC, animated: true)

// Връщане към предишния екран
navigationController?.popViewController(animated: true)

// Връщане към root екрана
navigationController?.popToRootViewController(animated: true)

Push навигация в Android: Navigation Component

Navigation Component — библиотека на Android Jetpack за декларативна навигация. Тя предоставя NavController, който управлява фрагменти или compose екрани чрез навигационен граф (nav_graph). Push в Android е аналогичен на iOS: всеки нов Fragment се добавя в back stack, а бутонът назад възстановява предишния.

NavHost и NavGraph

NavHost — контейнер, който показва текущата дестинация от NavGraph. NavGraph — XML файл, описващ всички екрани на приложението и връзките между тях. Преходите се дефинират чрез actions с посочване на destination и опционални аргументи. Navigation Component автоматично обработва системния бутон назад, анимациите и запазването на състоянието.

Аргументи и Safe Args

За прехвърляне на данни между екрани Navigation Component поддържа Safe Args — генериране на код на type-safe класове за аргументи. Вместо ръчно поставяне на данни в Bundle, разработчикът декларира аргументи в NavGraph и ги получава чрез генерираните класове Directions и Args. Safe Args елиминира грешки от несъответствие на типове и опростява рефакторирането.

kotlin
// Дефиниция на NavGraph в 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) }
    }
}

// Програмна навигация
navController.navigate("detail/42")

BottomNavigation с Push стек

Комбинацията от Bottom Navigation и Push навигация — често срещан модел в мобилни приложения. Всеки раздел на Bottom Navigation има собствен стек от екрани. Navigation Component поддържа това чрез NavHost per tab или единичен NavHost с отделни графи за всеки раздел. Превключването на раздели не нулира състоянието на Push стековете.

Push Presentation срещу Modal Presentation

Push Presentation и Modal Presentation решават различни навигационни задачи. Push е предназначен за последователно преглеждане на съдържание, където всеки нов екран задълбочава контекста. Modal — за фокусирани задачи, изискващи завършване. На практика е важно да изберете правилния модел за конкретния сценарий.

Основни критерии за избор: ако потребителят трябва свободно да се връща назад без загуба на контекст — изберете Push. Ако задачата е временна и блокира основното съдържание (форма, авторизация) — използвайте Modal. Смесването на модели на един екран (Push вътре в Modal) е позволено, но изисква ясна визуална йерархия.

Грешка е използването на Modal за последователности от екрани, които логически са част от основния поток. Например, асистентът за създаване на поръчка (Стъпка 1 → Стъпка 2 → Стъпка 3) е по-добре да се реализира чрез Push вътре в модален контейнер, отколкото чрез верига от модални прозорци. Това запазва навигационната йерархия и предвидимостта на връщането.

Примери за имплементация в Swift и Kotlin

Нека разгледаме пълната имплементация на Push навигация на двете платформи. Примерът в Swift демонстрира UINavigationController с програмно управление на стека и обработка на дълбоки връзки. Примерът в Kotlin показва Navigation Component с NavHost, аргументи и анимации.

swift
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)"
    }
}
kotlin
@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() })
        }
    }
}

Примерите показват основна Push навигация: списък → детайли. iOS използва storyboard-ове и UINavigationController с ръчно предаване на данни. Android използва NavHost с type-safe аргументи и автоматично управление на back stack. И двата подхода поддържат дълбоки връзки, персонализирани анимации и запазване на състоянието при завъртане.

Често задавани въпроси

С какво се различава Push Presentation от Present в iOS?

Push добавя екран в стека на UINavigationController с бутон за връщане. Present отваря модален прозорец без бутон назад — потребителят трябва изрично да го затвори. Push е подходящ за последователно съдържание, Present — за фокусирани задачи. В SwiftUI Push съответства на NavigationLink, а Present — на .sheet.

Как да управляваме дълбок навигационен стек в Android?

Navigation Component предоставя методи popBackStack до определена точка и popUpTo за почистване на стека. За предотвратяване на препълване на стека използвайте popUpTo(startDestination) { inclusive = true } преди navigate. Това гарантира, че стекът не съдържа повече от 5–7 екрана едновременно.

Може ли да се комбинират Push и Modal в една навигация?

Да, комбинацията от Push и Modal е стандартен модел. Например: списък → Push към детайли → Modal за авторизация. Препоръчва се да не поставяте Push вътре в Modal: модалният прозорец не трябва да съдържа стекова навигация. Ако вътре в модалния прозорец е необходима последователност от екрани — използвайте Push вътре в модален контейнер.

Как работи Push Presentation с Deep Links?

Deep Links в Push навигацията отварят приложението на конкретен екран. iOS използва URL схеми и Universal Links с UINavigationController. Android използва Intent Filters с NavDeepLink. И в двата случая системата анализира връзката и създава навигационен стек до целевия екран, запазвайки възможността за връщане.

Как да анимираме Push преходи?

iOS използва стандартната анимация на плъзгане, която може да се настрои чрез UINavigationControllerDelegate. Android Navigation Component поддържа персонализирани анимации чрез XML ресурси (slide_in_right, slide_out_left). За Compose използвайте AnimatedNavHost с модификатора animateItemPlacement.

Обобщение

  • Push Presentation — модел на стекова навигация, който добавя всеки нов екран над предишния с бутон за връщане.
  • UINavigationController управлява стека в iOS чрез pushViewController и popViewController с навигационна лента.
  • Android Navigation Component предоставя NavHost, NavGraph и Safe Args за type-safe навигация.
  • Push се различава от Modal по липсата на блокиране на съдържанието и свободно връщане по стека.
  • Дълбочината на стека не трябва да надвишава 10 екрана за оптимална производителност на приложението.
  • Deep Links в Push навигацията се поддържат чрез URL схеми и NavDeepLink със запазване на историята.
  • Препоръчва се използването на Push за йерархично съдържание и Modal — за фокусирани задачи.

Ще разработим мобилно приложение под ключ

IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.

Обсъдете проекта

Прочетете също