Published on

SwiftUIda NavigationView va NavigationLink — qanday ishlatish kerak

Authors

Bu videoda biz NavigationView va NavigationLink haqida gaplashamiz. Bu SwiftUIdagi eng muhim komponentlardan biri — deyarli har qanday ilovada ishlatiladi.

NavigationView — bu container. Uni ishlatish bilan bir qator tayyor imkoniyatlar kelib chiqadi:

  • Yuqorida sarlavha qo'shish
  • Yuqori panelga tugmalar qo'shish
  • NavigationLink orqali boshqa ekranlarga o'tish va avtomatik "Orqaga" tugmasi

Boshlang'ich sozlama — NavigationView

struct NavigationViewBootcamp: View {
    var body: some View {
        NavigationView {
            ScrollView {
                Text("Salom dunyo!")
                Text("Salom dunyo!")
                Text("Salom dunyo!")
            }
            .navigationTitle("Barcha xabarlar")
        }
    }
}

ScrollView NavigationView ichida bo'lganda sarlavha uchun yuqorida joy qoladi. navigationTitle modifikatori NavigationView ichidagi view-ga qo'yiladi — NavigationView o'ziga emas.


// Avtomatik — sarlavha katta boshlanadi, scroll qilganda kichrayadi
// Bu eng chiroyli va professional ko'rinish
.navigationTitle("Barcha xabarlar")
// yoki
.navigationBarTitleDisplayMode(.automatic)

// Doim kichik — sarlavha har doim yuqori panelda kichik ko'rinadi
.navigationBarTitleDisplayMode(.inline)

// Doim katta — scroll qilganda ham kichraymaydi
.navigationBarTitleDisplayMode(.large)

Tavsiya: .automatic eng yaxshi ko'rinishni beradi — scroll qilganda sarlavha katta formatdan kichik formatga o'tadi. Bu professional ilovalarda keng tarqalgan effekt.


NavigationLink — bu tugma kabi ishlaydi, lekin bosilganda o'ngdan yangi ekran surilib kiradi:

NavigationView {
    ScrollView {
        // 1-usul: faqat matn bilan
        NavigationLink("Salom dunyo", destination: Text("Ikkinchi ekran"))

        // 2-usul: alohida destination va label bilan
        NavigationLink {
            MyOtherScreen()
        } label: {
            Text("Bu yerga bosing")
        }
    }
    .navigationTitle("Barcha xabarlar")
}

NavigationLink bosilganda birinchi ekranning sarlavhasi avtomatik ravishda ikkinchi ekranning "Orqaga" tugmasiga aylanadi. Bu tayyor va professional ko'rinish.


Ikkinchi ekranga sarlavha qo'shish va davom ettirish

// Birinchi ekran
struct NavigationViewBootcamp: View {
    var body: some View {
        NavigationView {
            ScrollView {
                NavigationLink("Ikkinchi ekranga o'tish") {
                    MySecondScreen()
                }
            }
            .navigationTitle("Birinchi ekran")
        }
    }
}

// Ikkinchi ekran
struct MySecondScreen: View {
    var body: some View {
        ZStack {
            Color.green.edgesIgnoringSafeArea(.all)

            // Ikkinchi ekrandan uchinchi ekranga ham o'tish mumkin
            NavigationLink("Uchinchi ekranga o'tish") {
                Text("Uchinchi ekran")
            }
        }
        .navigationTitle("Ikkinchi ekran")
    }
}

Bir NavigationView ichida xohlagancha chuqur ketishingiz mumkin — har bir ekranga o'z sarlavhasi va avtomatik "Orqaga" tugmasi qo'shiladi.


Ba'zan standart navigatsiya panelini yashirib, o'z dizaynimizni qo'llash kerak:

struct MySecondScreen: View {

    @Environment(\.presentationMode) var presentationMode

    var body: some View {
        ZStack {
            Color.green.edgesIgnoringSafeArea(.all)

            VStack {
                // O'z "Orqaga" tugmamiz
                Button("Orqaga") {
                    presentationMode.wrappedValue.dismiss()
                }

                NavigationLink("Oldinga") {
                    Text("Uchinchi ekran")
                }
            }
        }
        // Standart navigatsiya panelini yashirish
        .navigationBarHidden(true)
    }
}

presentationMode.wrappedValue.dismiss() — Sheet-da ham, NavigationView-da ham bir xil ishlaydi. SwiftUI joriy muhitni o'zi aniqlaydi va to'g'ri dismiss usulini tanlaydi.


struct NavigationViewBootcamp: View {
    var body: some View {
        NavigationView {
            ScrollView {
                Text("Kontent")
            }
            .navigationTitle("Barcha xabarlar")
            .navigationBarItems(
                // Chap tomonga
                leading: HStack {
                    Image(systemName: "person.fill")
                    Image(systemName: "flame.fill")
                },
                // O'ng tomonga
                trailing: NavigationLink {
                    MyOtherScreen()
                } label: {
                    Image(systemName: "gear")
                }
                .accentColor(.red)
            )
        }
    }
}

navigationBarItems — yuqori panelning chap (leading) va o'ng (trailing) tomoniga istalgan view qo'shish imkonini beradi. Ular bitta tugma, HStack ichida bir nechta tugma yoki NavigationLink bo'lishi mumkin.

.accentColor(.red) — NavigationLink yoki tugmaning standart ko'k rangini o'zgartiradi.


To'liq misol

struct NavigationViewBootcamp: View {
    var body: some View {
        NavigationView {
            ScrollView {
                NavigationLink {
                    MyOtherScreen()
                } label: {
                    Text("Ikkinchi ekranga o'tish")
                }
            }
            .navigationTitle("Barcha xabarlar")
            .navigationBarTitleDisplayMode(.automatic)
            .navigationBarItems(
                leading: Image(systemName: "person.fill"),
                trailing: Image(systemName: "gear")
            )
        }
    }
}

struct MyOtherScreen: View {

    @Environment(\.presentationMode) var presentationMode

    var body: some View {
        ZStack {
            Color.green.edgesIgnoringSafeArea(.all)

            Button("Orqaga") {
                presentationMode.wrappedValue.dismiss()
            }
        }
        .navigationTitle("Ikkinchi ekran")
        .navigationBarHidden(false)
    }
}

⚠️ Muhim qoidalar

// ❌ NOTO'G'RI — NavigationView ichiga NavigationView qo'ymang
NavigationView {
    NavigationView {  // Bu xatolarga olib keladi!
        Text("Salom")
    }
}

// ✅ TO'G'RI — faqat bitta NavigationView, chuqur ketish NavigationLink orqali
NavigationView {
    NavigationLink("Ikkinchi") {
        NavigationLink("Uchinchi") {
            Text("Uchinchi ekran")
        }
    }
}

Butun ilova uchun bitta NavigationView yetarli — odatda ilovaning eng yuqori qatlamida qo'yiladi.


Xulosa

XususiyatQo'llash
NavigationViewBarcha navigatsiya uchun container — bitta bo'lishi kerak
.navigationTitle()Har bir ekran sarlavhasi
.navigationBarTitleDisplayMode(.automatic)Scroll bilan o'zgaradigan sarlavha — tavsiya etiladi
NavigationLinkEkranga o'tish — avtomatik "Orqaga" tugmasi bilan
.navigationBarHidden(true)Standart panelni yashirish
presentationMode.wrappedValue.dismiss()O'z "Orqaga" tugmangiz uchun
.navigationBarItems(leading:trailing:)Yuqori panelga tugmalar qo'shish

NavigationView Sheet va Transition-ga qaraganda ko'p hollarda qulayroq — tayyor "Orqaga" tugmasi, sarlavha va panel bilan juda kam kod yozib professional natijaga erishiladi.

Buy mea coffee