Push Presentation — الگوی ناوبری در برنامههای موبایل است که در آن هر صفحه جدید به پشته ناوبری بالای صفحه قبلی اضافه میشود. کاربر میتواند بهصورت متوالی در محتوا向前 حرکت کرده و از طریق دکمه سیستمی یا سوایپ به عقب بازگردد. به گزارش Apple Developer, 2025، UINavigationController در ۸۵٪ برنامههای iOS به عنوان الگوی اصلی ناوبری استفاده میشود. در Android قابلیت مشابه از طریق FragmentManager و NavController از Navigation Component پیادهسازی میشود.
نکات اصلی
Push Presentation — مکانیزم ناوبری است که در آن هر صفحه جدید در بالای پشته قرار میگیرد و صفحه قبلی در حافظه زیر آن باقی میماند. کاربر با باز کردن متوالی صفحات جزئیات به عمق محتوا نفوذ میکند و دکمه بازگشت او را به مرحله قبلی برمیگرداند.
معماری ناوبری Push بر اساس ساختار داده LIFO (Last In, First Out) است. صفحه جدید همیشه به انتهای پشته اضافه میشود و حذف فقط از بالا انجام میشود. این رفتار قابل پیشبینی را تضمین میکند: کاربر همیشه میداند که دکمه بازگشت او را دقیقاً یک مرحله به عقب برمیگرداند. پشته ناوبری بسته به پیچیدگی برنامه میتواند از ۲ تا ۱۰+ صفحه داشته باشد.
Push Presentation الگوی اصلی در برنامههای دارای محتوای سلسلهمراتبی است: فیدهای خبری، کاتالوگ محصولات، منوهای چندسطحی و مستندات. به گفته Material Design، ناوبری پشتهای برای سناریوهایی مناسب است که کاربر محتوا را از کلی به جزئی بررسی میکند و هر صفحه بعدی درک موضوع را عمیقتر میکند.
پشته ناوبری — مجموعه منظمی از صفحات است که هر عنصر وضعیت ViewController یا Fragment خود را ذخیره میکند. در عملیات Push، صفحه جدید به پشته اضافه میشود، نمایش آن متحرک میشود (اسلاید از راست در iOS، اسلاید از پایین یا Fade در Android) و فعال میشود.
در عملیات Pop (فشار دکمه بازگشت) صفحه بالایی از پشته حذف میشود، از بین میرود یا به حافظه میرود و صفحه قبلی فعال میشود. iOS به طور پیشفرض ViewController حذف شده را نابود کرده و حافظه را آزاد میکند. Android میتواند Fragment را در back stack با امکان بازیابی بدون بازآفرینی حفظ کند.
عمق پشته بر عملکرد تأثیر میگذارد: هر صفحه در پشته حافظه مصرف میکند. توصیه میشود بیش از ۱۰ صفحه در پشته ذخیره نکنید. برای ناوبری عمیق از PopToRoot یا راهاندازی مجدد پشته با صفحه ریشه جدید استفاده کنید. Navigation Component در Android به طور خودکار وضعیت پشته را از طریق SavedStateHandle مدیریت میکند.
UINavigationController — کنترلر کانتینری iOS که پشته UIViewController را مدیریت میکند. این کنترلر به طور خودکار نوار ناوبری (navigation bar) را با عنوان صفحه فعلی و دکمه بازگشت نمایش میدهد. انیمیشن پیشفرض Push — اسلاید از راست به چپ که احساس نفوذ در محتوا را به کاربر منتقل میکند.
افزودن صفحه از طریق pushViewController(_:animated:) انجام میشود. حذف — از طریق popViewController(animated:). برای بازگشت به صفحه ریشه از popToRootViewController(animated:) استفاده میشود. UINavigationController همچنین مدیریت برنامهنویسی پشته را از طریق ویژگی viewControllers — آرایه تمام کنترلرهای موجود در پشته — پشتیبانی میکند.
نوار ناوبری شامل عنوان صفحه (title)، دکمه بازگشت و دکمههای اختیاری عملیات است. از iOS 11، Large Titles (prefersLargeTitles) امکان نمایش عنوان با فونت بزرگتر را فراهم میکنند که در هنگام اسکرول به صورت متحرک کوچک میشود. این کار سلسلهمراتب ناوبری را بهبود میبخشد و کاربر را از بخش فعلی مطلع میکند.
let detailVC = DetailViewController()
detailVC.title = "Item Details"
navigationController?.pushViewController(detailVC, animated: true)
// بازگشت به صفحه قبلی
navigationController?.popViewController(animated: true)
// بازگشت به صفحه ریشه
navigationController?.popToRootViewController(animated: true)
Navigation Component — کتابخانه Android Jetpack برای ناوبری اعلانی. این کتابخانه NavController را فراهم میکند که فرگمنتها یا صفحات Compose را از طریق گراف ناوبری (nav_graph) مدیریت میکند. Push در Android مشابه iOS است: هر Fragment جدید به back stack اضافه میشود و دکمه بازگشت قبلی را بازیابی میکند.
NavHost — کانتینری که مقصد فعلی را از NavGraph نمایش میدهد. NavGraph — فایل XML که تمام صفحات برنامه و ارتباطات بین آنها را توصیف میکند. انتقالها از طریق actions با مشخص کردن destination و آرگومانهای اختیاری تعریف میشوند. Navigation Component به طور خودکار دکمه بازگشت سیستم، انیمیشنها و ذخیره وضعیت را مدیریت میکند.
برای انتقال داده بین صفحات، Navigation Component از Safe Args — تولید کد کلاسهای آرگومان type-safe — پشتیبانی میکند. به جای قرار دادن دستی داده در Bundle، توسعهدهنده آرگومانها را در NavGraph اعلان کرده و آنها را از طریق کلاسهای تولیدشده Directions و Args دریافت میکند. Safe Args خطاهای عدم تطابق نوع را از بین میبرد و بازسازی کد را ساده میکند.
// تعریف 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")
ترکیب Bottom Navigation و ناوبری Push — الگوی رایج در برنامههای موبایل. هر زبانه Bottom Navigation پشته صفحات مخصوص خود را دارد. Navigation Component این کار را از طریق NavHost per tab یا یک NavHost واحد با گرافهای جداگانه برای هر زبانه پشتیبانی میکند. تغییر زبانهها وضعیت پشتههای Push را بازنشانی نمیکند.
Push Presentation و Modal Presentation وظایف مختلف ناوبری را حل میکنند. Push برای مرور متوالی محتوا طراحی شده است، جایی که هر صفحه جدید زمینه را عمیقتر میکند. Modal — برای وظایف متمرکز که نیاز به تکمیل دارند. در عمل انتخاب الگوی مناسب برای سناریوی خاص مهم است.
معیارهای اصلی انتخاب: اگر کاربر باید بدون از دست دادن زمینه آزادانه به عقب بازگردد — Push را انتخاب کنید. اگر وظیفه موقتی است و محتوای اصلی را مسدود میکند (فرم، احراز هویت) — از Modal استفاده کنید. مخلوط کردن الگوها در یک صفحه (Push داخل Modal) مجاز است اما نیاز به سلسلهمراتب بصری واضح دارد.
استفاده از Modal برای دنبالههای صفحاتی که منطقاً بخشی از جریان اصلی هستند اشتباه است. به عنوان مثال، جادوگر ایجاد سفارش (مرحله ۱ → مرحله ۲ → مرحله ۳) بهتر است از طریق Push درون کانتینر Modal پیادهسازی شود، نه از طریق زنجیره پنجرههای Modal. این کار سلسلهمراتب ناوبری و قابلیت پیشبینی بازگشت را حفظ میکند.
بیایید پیادهسازی کامل ناوبری Push را در هر دو پلتفرم بررسی کنیم. نمونه Swift UINavigationController را با مدیریت برنامهنویسی پشته و پردازش لینکهای عمیق نشان میدهد. نمونه Kotlin Navigation Component را با NavHost، آرگومانها و انیمیشنها نشان میدهد.
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() })
}
}
}
نمونهها ناوبری پایه Push را نشان میدهند: لیست → جزئیات. iOS از storyboard ها و UINavigationController با انتقال دستی داده استفاده میکند. Android از NavHost با آرگومانهای type-safe و مدیریت خودکار back stack استفاده میکند. هر دو رویکرد از لینکهای عمیق، انیمیشنهای سفارشی و ذخیره وضعیت در هنگام چرخش پشتیبانی میکنند.
سوالات متداول
Push صفحه را به پشته UINavigationController با دکمه بازگشت اضافه میکند. Present یک پنجره Modal بدون دکمه بازگشت باز میکند — کاربر باید صریحاً آن را ببندد. Push برای محتوای متوالی مناسب است، Present — برای وظایف متمرکز. در SwiftUI Push معادل NavigationLink و Present معادل .sheet است.
Navigation Component متدهای popBackStack تا نقطه مشخص و popUpTo برای پاکسازی پشته را فراهم میکند. برای جلوگیری از سرریز پشته از popUpTo(startDestination) { inclusive = true } قبل از navigate استفاده کنید. این تضمین میکند که پشته بیش از ۵–۷ صفحه همزمان نداشته باشد.
بله، ترکیب Push و Modal یک الگوی استاندارد است. به عنوان مثال، لیست → Push به جزئیات → Modal برای احراز هویت. توصیه میشود Push را داخل Modal قرار ندهید: پنجره Modal نباید شامل ناوبری پشتهای باشد. اگر داخل پنجره Modal به دنباله صفحات نیاز است — از Push داخل کانتینر Modal استفاده کنید.
Deep Links در ناوبری Push برنامه را در صفحه مشخص باز میکنند. iOS از طرحهای URL و Universal Links با UINavigationController استفاده میکند. Android از Intent Filters با NavDeepLink استفاده میکند. در هر دو مورد، سیستم لینک را تجزیه کرده و پشته ناوبری تا صفحه مقصد را ایجاد میکند و امکان بازگشت را حفظ میکند.
iOS از انیمیشن استاندارد اسلاید استفاده میکند که از طریق UINavigationControllerDelegate قابل تنظیم است. Android Navigation Component از انیمیشنهای سفارشی از طریق منابع XML (slide_in_right, slide_out_left) پشتیبانی میکند. برای Compose از AnimatedNavHost با اصلاحکننده animateItemPlacement استفاده کنید.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید