NavigationLink SwiftUI-də NavigationStack və ya NavigationView-də başqa ekrana keçid üçün nəzərdə tutulmuş idarəetmə elementidir. Apple Developer Documentation, 2024-ə görə, NavigationLink klikləndikdə hədəf View-i naviqasiya stekinə yerləşdirən düymə yaradır. iOS 16+-da hədəf View-lərin vaxtından əvvəl initallaşdırılmasının qarşısını almaq üçün birbaşa destination əvəzinə NavigationLink-dən value və NavigationDestination ilə istifadə etmək tövsiyə olunur.
Əsas məqamlar
NavigationLink klikləndikdə naviqasiya keçidini işə salan View-dir. NavigationStack daxilində NavigationLink-ə klikləmək hədəf ekranı stekə yerləşdirir və sistemin “Geri” düyməsini göstərir. NavigationLink iOS 13-dən mövcuddur və SwiftUI-də istifadəçi naviqasiyasının əsas yoludur.
NavigationLink UIButton-dan miras almır — bu, kontekstə avtomatik uyğunlaşan SwiftUI View-dir. List daxilində NavigationLink açıqlama göstəricisi (disclosure indicator) ilə göstərilir. Siyahıdan kənarda NavigationLink adi düymə kimi davranır, lakin naviqasiya davranışı ilə.
SwiftUI Lab (2024)-ə görə, NavigationLink SwiftUI tətbiqlərində ən çox istifadə olunan View-lərdəndir, yalnız Text, Image və VStack-dən geri qalır. Initallaşdırma formaları arasındakı fərqləri başa düşmək performans və proqnozlaşdırıla bilən naviqasiya üçün kritik əhəmiyyət kəsb edir.
Klikləndikdə NavigationLink ən yaxın NavigationStack və ya NavigationView ilə əlaqəli naviqasiya stekinə dəyər (və ya destination) əlavə edir. SwiftUI View iyerarxiyası vasitəsilə naviqasiya yolunu ötürmək üçün EnvironmentValue-dan istifadə edir. NavigationLink bu yolu Environment-dan oxuyur və klikləmə zamanı onu dəyişdirir.
NavigationLink iki əsas formaya malikdir: destination (birbaşa hədəf View göstərmə) və value (NavigationDestination üçün dəyər). Forma seçimi iOS versiyasından və naviqasiya arxitekturasından asılıdır.
| Forma | Initallaşdırıcı | iOS 13–15 | iOS 16+ |
|---|---|---|---|
| Destination | NavigationLink(destination:label:) | Tövsiyə olunur | Tövsiyə edilmir |
| Value | NavigationLink(value:label:) | Mövcud deyil | Tövsiyə olunur |
| IsActive | NavigationLink(isActive:destination:label:) | Proqram naviqasiyası | Tövsiyə edilmir |
Destination forması (iOS 13+): NavigationLink(destination: DetailView(), label: { Text(“Open”) }). Bu forma NavigationLink render edilərkən dərhal DetailView yaradır, hətta istifadəçi linkə klikləməsə belə. Bu, View-in vaxtından əvvəl initallaşdırılmasına və hədəf View initallaşdırıcıda ağır əməliyyatlar yerinə yetirirsə potensial performans problemlərinə səbəb olur.
Value forması (iOS 16+): NavigationLink(value: “detail_42”, label: { Text(“Open”) }). Hədəf View yalnız link klikləndikdə, SwiftUI müvafiq .navigationDestination tapdıqda yaradılır. Bu, vaxtından əvvəl initallaşdırmanın qarşısını alır və naviqasiyanı daha proqnozlaşdırıla bilən edir.
NavigationStack ilə NavigationLink iOS 16+-da value formasına keçid tələb edir. Naviqasiya üçün məlumat tipini (String, Int, enum Route) təyin edir və .navigationDestination vasitəsilə destination-i qeydiyyatdan keçirirsiniz. NavigationLink stekə yalnız dəyəri yerləşdirir, SwiftUI isə klikləmə zamanı hədəf View-i yaradır.
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)
}
}
}
// Proqram naviqasiyası:
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("Parametrləri aç") {
path.append(AppRoute.settings)
}
}
}
}
}
Proqram naviqasiyası: path-ə dəyər əlavə etmək (path.append vasitəsilə) eyni dəyərlə NavigationLink-ə klikləməyə bərabərdir. Bu, ViewModel, Coordinator və ya push bildirişlərinə cavab olaraq naviqasiyanı tətbiq etməyə imkan verir.
IsActive forması (NavigationLink(isActive:destination:label:)) uyğunluq üçün mövcuddur, lakin iOS 16+-da tövsiyə edilmir. Yol massivi və ya NavigationPath-ə Binding ilə value formasından istifadə edin.
List-də NavigationLink avtomatik olaraq sətrin sağ hissəsində açıqlama göstəricisi (chevron) göstərir, istifadəçiyə klikləmənin başqa ekrana keçidə səbəb olacağını bildirir. List oxun göstərilməsini avtomatik idarə edir — siyahıdan kənar adi NavigationLink-dən fərqli olaraq, orada ox yoxdur.
iOS 16-dan etibarən List NavigationLink ilə List(data:rowContent:) daxilində avtomatik olaraq value formasından istifadə edir. List daxilində ForEach istifadə edərkən də açıqlama göstəricisi avtomatik əlavə olunur. Bu davranış modifierlər vasitəsilə söndürülə bilməz — yalnız NavigationLink-in Button ilə əvəz edilməsi oxu silə bilər.
List-də destination forması problemi: List daxilində NavigationLink(destination:label:) istifadə edirsinizsə, bütün hədəf View-lər istifadəçi linkə klikləyib-klikləməməsindən asılı olmayaraq siyahı yüklənərkən dərhal yaradılır. Çox sayda sətir olan siyahılar üçün bu, ilkin yükləməni əhəmiyyətli dərəcədə yavaşlada və yaddaş istehlakını artıra bilər. NavigationStack ilə value forması bu problemi həll edir.
WWDC 2022 (Session 10054)-ə görə, Apple yeni layihələr üçün NavigationStack və NavigationLink-in value formasından istifadə etməyi tövsiyə edir. Bu, xüsusilə sətir sayının çox ola biləcəyi dinamik məlumatlı List-lər üçün vacibdir.
Nümunə 1: fərdi görünüşlü NavigationLink. NavigationLink label kimi istənilən View qəbul edir, link üçün istənilən dizayn yaratmağa imkan verir. List daxilində bu xüsusilə rahatdır — NavigationLink istifadə edərkən avtomatik olaraq açıqlama göstəricisi əldə edirsiniz.
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)
}
Nümunə 2: oxsuz NavigationLink (fərdi düymə). Açıqlama göstəricisinə ehtiyacınız yoxdursa, proqram naviqasiyası üçün Button istifadə edin: path.append(value). Bu, NavigationLink-in təbii görünmədiyi fərdi interfeys elementləri üçün faydalıdır.
Nümunə 3: şərti naviqasiya. NavigationLink-i boş destination istifadə edərək və ya müəyyən dəyərlər üçün .navigationDestination əlavə etməyərək bloklaya bilərsiniz. Path vasitəsilə proqram naviqasiyası dəyər əlavə etməzdən əvvəl şərtləri yoxlamağa imkan verir.
Hacking with Swift (2024)-ə görə, NavigationLink ilə bağlı problemlərin əksəriyyəti köhnə layihələrdə destination formasının istifadəsi ilə bağlıdır. NavigationStack-ə miqrasiya zamanı bütün NavigationLink(destination:label:)-i NavigationLink(value:label:) ilə əvəz edin və kök səviyyədə .navigationDestination əlavə edin.
Tez-tez verilən suallar
NavigationLink SwiftUI-də başqa ekrana keçid üçün View-dir. Klikləndikdə hədəf ekranı NavigationStack və ya NavigationView naviqasiya stekinə yerləşdirir. İki formanı dəstəkləyir: destination (hədəf View) və value (marşrutlaşdırma üçün dəyər).
Value forması (iOS 16+) üstünlük təşkil edir: hədəf View link render edilərkən deyil, yalnız klikləmə zamanı yaradılır. Destination forması View-i dərhal yaradır, bu da performans problemlərinə səbəb ola bilər. iOS 16+ layihələri üçün value + NavigationDestination istifadə edin.
SwiftUI avtomatik olaraq List daxilində NavigationLink-ə disclosure indicator (ox) əlavə edir, keçid imkanını bildirir. Bu davranış söndürülə bilməz. Ox lazım deyilsə, path.append() ilə proqram naviqasiyası üçün Button istifadə edin.
Binding yolu ilə NavigationStack istifadə edin və path.append(value) vasitəsilə dəyərlər əlavə edin. Bu, eyni dəyərlə NavigationLink-ə klikləməyə bərabərdir. Proqram naviqasiyası Deeplink-ləri, push bildirişlərini və Coordinator nümunəsini tətbiq etməyə imkan verir.
Destination forması, hədəf View-lər initallaşdırıcıda ağır əməliyyatlar yerinə yetirirsə təsir edə bilər — bütün destination-lər siyahı render edilərkən yaradılır. NavigationStack ilə value forması bu problemi həll edir, View-i yalnız klikləmə zamanı yaradır. 50+ sətirli siyahılar üçün fərq əhəmiyyətlidir.
Xülasə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun