NavigationLink — шта је то, дугме прелаза у SwiftUI

Аутор: IT Sectr Објављено: 2026-06-25 Време читања: 6 мин

NavigationLink је контролни елемент у SwiftUI намењен за прелазак на други екран у NavigationStack или NavigationView. Према Apple Developer Documentation, 2024, NavigationLink ствара дугме, чијим притиском се циљни View смешта у навигациони стек. У iOS 16+ препоручује се коришћење NavigationLink са value и NavigationDestination, а не директно са destination, како би се избегла превремена иницијализација циљних View.

Главно

  • NavigationLink — дугме прелаза на други екран у SwiftUI
  • Две форме — са destination:label: и са value:label:
  • Value форма препоручена у iOS 16+ (NavigationStack)
  • Destination форма доводи до превремене иницијализације View
  • Аутоматска стрелица откривања у листама List

NavigationLink је View које притиском покреће навигациони прелаз. Унутар NavigationStack, притисак на NavigationLink смешта циљни екран на стек и приказује системско дугме „Назад”. NavigationLink постоји од iOS 13 и представља основни начин корисничке навигације у SwiftUI.

NavigationLink не наслеђује од UIButton — то је SwiftUI View које се аутоматски прилагођава контексту. Унутар List, NavigationLink се приказује са стрелицом откривања (disclosure indicator). Ван листе, NavigationLink се понаша као обично дугме, али са навигационим понашањем.

Према SwiftUI Lab (2024), NavigationLink је један од најчешће коришћених View у SwiftUI апликацијама, одмах иза Text, Image и VStack. Разумевање разлика између форми иницијализације је критично за перформансе и предвидљиво понашање навигације.

Како NavigationLink ради испод хаубе

Притиском, NavigationLink додаје вредност (или destination) у навигациони стек повезан са најближим NavigationStack или NavigationView. SwiftUI користи EnvironmentValue за пренос путање навигације кроз хијерархију View. NavigationLink чита ову путању из Environment и притиском је мења.

NavigationLink има две основне форме: са destination (директно навођење циљног View) и са value (вредност за NavigationDestination). Избор форме зависи од верзије iOS и архитектуре навигације.

ФормаИницијализаторiOS 13–15iOS 16+
DestinationNavigationLink(destination:label:)Препоручује сеНе препоручује се
ValueNavigationLink(value:label:)Није доступнаПрепоручује се
IsActiveNavigationLink(isActive:destination:label:)Програмска навигацијаНе препоручује се

Destination форма (iOS 13+): NavigationLink(destination: DetailView(), label: { Text(„Open”) }). Ова форма ствара DetailView одмах при рендеровању NavigationLink, чак и ако корисник није кликнуо на линк. Ово доводи до превремене иницијализације View и потенцијалних проблема са перформансама, ако циљни View изводи тешке операције у иницијализатору.

Value форма (iOS 16+): NavigationLink(value: „detail_42”, label: { Text(„Open”) }). Циљни View се ствара тек при клику на линк, када SwiftUI пронађе одговарајући .navigationDestination. Ово спречава превремену иницијализацију и чини навигацију предвидљивијом.

NavigationLink са NavigationStack у iOS 16+ захтева прелазак на value форму. Дефинишете тип података за навигацију (String, Int, enum Route) и региструјете destination преко .navigationDestination. NavigationLink смешта у стек само вредност, а SwiftUI ствара циљни View при клику.

swift
struct CatalogView: View {
    let categories: [String]

    var body: some View {
        List(categories, id: \.self) { category in
            NavigationLink(value: category) {
                Text(category)
            }
        }
        .navigationDestination(for: String.self) { category in
            CategoryView(name: category)
        }
    }
}

// Програмска навигација:
struct DeepLinkView: View {
    @State private var path: [AppRoute] = []

    var body: some View {
        NavigationStack(path: $path) {
            HomeView()
                .navigationDestination(for: AppRoute.self) { route in
                    switch route {
                    case .detail(let id): DetailView(id: id)
                    case .settings: SettingsView()
                    }
                }
                .toolbar {
                    Button("Отвори подешавања") {
                        path.append(AppRoute.settings)
                    }
                }
        }
    }
}

Програмска навигација: додавање вредности у path (преко path.append) је еквивалентно притиску на NavigationLink са истом вредношћу. Ово омогућава имплементацију навигације из ViewModel, Coordinator или као одговор на push обавештења.

IsActive форма (NavigationLink(isActive:destination:label:)) доступна је за компатибилност, али се не препоручује у iOS 16+. Користите value форму са Binding на низ путање или NavigationPath.

NavigationLink у List аутоматски приказује стрелицу откривања (chevron) у десном делу реда, сигнализирајући кориснику да притисак води до другог екрана. List управља приказивањем стрелице аутоматски — за разлику од обичног NavigationLink ван листе, где стрелице нема.

Од iOS 16, List са NavigationLink аутоматски користи value форму унутар List(data:rowContent:). При коришћењу ForEach унутар List, стрелица откривања се такође додаје аутоматски. Ово понашање се не може искључити модификаторима — само замена NavigationLink са Button може уклонити стрелицу.

Проблем са destination формом у List: ако користите NavigationLink(destination:label:) унутар List, сви циљни View се стварају одмах при учитавању листе, без обзира да ли је корисник кликнуо на линк или не. За листе са великим бројем редова, ово може значајно успорити почетно учитавање и повећати потрошњу меморије. Value форма са NavigationStack решава овај проблем.

Према WWDC 2022 (Session 10054), Apple препоручује коришћење NavigationStack и value форме NavigationLink за нове пројекте. Ово је посебно важно за List са динамичким подацима, где број редова може бити велики.

Образац 1: прилагођени изглед NavigationLink. NavigationLink прихвата било које View као label, омогућавајући стварање произвољног дизајна за линк. Унутар List, ово је посебно згодно — добијате стрелицу откривања аутоматски при коришћењу NavigationLink.

swift
NavigationLink(value: ProductRoute.detail(product)) {
    HStack {
        AsyncImage(url: product.imageURL)
            .frame(width: 60, height: 60)
        VStack(alignment: .leading) {
            Text(product.name).font(.headline)
            Text(product.price) .foregroundColor(.secondary)
        }
    }
    .padding(8)
}

Образац 2: NavigationLink без стрелице (прилагођено дугме). Ако вам не треба стрелица откривања, користите Button за програмску навигацију: path.append(value). Ово је корисно за прилагођене елементе интерфејса где NavigationLink изгледа неприродно.

Образац 3: условна навигација. Можете блокирати NavigationLink коришћењем празног destination или не додавањем .navigationDestination за одређене вредности. Програмска навигација кроз path омогућава проверу услова пре додавања вредности.

Према Hacking with Swift (2024), већина проблема са NavigationLink повезана је са коришћењем destination форме у старим пројектима. При миграцији на NavigationStack, замените све NavigationLink(destination:label:) са NavigationLink(value:label:) и додајте .navigationDestination на коренском нивоу.

Често постављана питања

Шта је NavigationLink у SwiftUI?

NavigationLink је View за прелазак на други екран у SwiftUI. Притиском смешта циљни екран у навигациони стек NavigationStack или NavigationView. Подржава две форме: са destination (циљним View) и са value (вредношћу за рутирање).

Која форма NavigationLink је боља: destination или value?

Value форма (iOS 16+) је пожељнија: циљни View се ствара само при клику, а не при рендеровању линка. Destination форма ствара View одмах, што може изазвати проблеме са перформансама. За пројекте са iOS 16+ користите value + NavigationDestination.

Зашто NavigationLink ствара стрелицу у List?

SwiftUI аутоматски додаје disclosure indicator (стрелицу) NavigationLink-у унутар List, сигнализирајући могућност преласка. Ово понашање се не може искључити. Ако стрелица није потребна, користите Button са програмском навигацијом кроз path.append().

Како направити програмски прелаз кроз NavigationLink?

Користите NavigationStack са Binding путањом и додајте вредности кроз path.append(value). Ово је еквивалентно притиску на NavigationLink са истом вредношћу. Програмска навигација омогућава имплементацију Deeplink-ова, push обавештења и Coordinator обрасца.

Да ли NavigationLink утиче на перформансе?

Destination форма може утицати ако циљни View изводе тешке операције у иницијализатору — сви destination се стварају при рендеровању листе. Value форма са NavigationStack решава овај проблем, стварајући View само при клику. За листе са 50+ редова разлика је значајна.

Закључак

  • NavigationLink — дугме за навигационе прелазе између SwiftUI екрана
  • Value форма препоручена у iOS 16+ са NavigationStack
  • Destination форма ствара View превремено — избегавајте за велике листе
  • Disclosure indicator — аутоматска стрелица у List (не искључује се)
  • Програмска навигација кроз path.append() за Deeplink-ове и Coordinator
  • NavigationDestination региструје циљне екране по типовима података
  • IsActive форма — застарела, користите value форму на iOS 16+

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође