NavigationView: พื้นฐาน, สแต็กการนำทางในแอป SwiftUI

ผู้แต่ง: IT Sectr เผยแพร่เมื่อ: 2026-02-22 เวลาอ่าน: 6 นาที

NavigationView เป็นส่วนประกอบคอนเทนเนอร์ของ SwiftUI สำหรับจัดระเบียบการนำทางแบบสแต็กระหว่างหน้าจอ NavigationView จะสร้างสแต็กการนำทางพร้อมแถบนำทางอัตโนมัติ หัวเรื่อง และปุ่ม «กลับ» ตั้งแต่ iOS 16 เป็นต้นไป Apple แนะนำให้ใช้ NavigationStack อ่านเพิ่มเติมได้ในเอกสารของ Apple

ประเด็นสำคัญ

  • NavigationView — คอนเทนเนอร์ SwiftUI สำหรับการนำทางแบบสแต็ก สร้างแถบนำทางและปุ่มกลับ
  • NavigationLink — องค์ประกอบสำหรับเปลี่ยนไปยังหน้าจอใหม่ภายใน NavigationView
  • NavigationStack — ผู้สืบทอดของ NavigationView (iOS 16+) พร้อมการจัดการสแต็กแบบโปรแกรม
  • .toolbar — ตัวปรับแต่งสำหรับเพิ่มปุ่มในแถบนำทาง
  • .navigationTitle — กำหนดหัวเรื่องหน้าจอในสไตล์ large หรือ inline

NavigationView คืออะไร?

NavigationView คือคอนเทนเนอร์ SwiftUI ที่ห่อหุ้มลำดับชั้นของหน้าจอและให้อินเทอร์เฟซการนำทาง ภายใน NavigationView จะทำงาน NavigationLink — องค์ประกอบที่เมื่อกดแล้วจะแทนที่หน้าจอปัจจุบันด้วยหน้าจอใหม่ NavigationView จะเพิ่มแถบนำทางพร้อมหัวเรื่องและปุ่ม «กลับ» โดยอัตโนมัติ

NavigationView ปรากฏใน iOS 13 พร้อมกับ SwiftUI ในแนวคิดแล้วมันแทนที่ UINavigationController จาก UIKit แต่ถูกนำไปใช้ในรูปแบบประกาศ แทนที่จะ push/pop ด้วยตนเอง นักพัฒนาจะอธิบายความสัมพันธ์ระหว่างหน้าจอผ่าน NavigationLink ระบบจะจัดการสแต็กโดยอัตโนมัติ

NavigationView รองรับตัวปรับแต่ง .navigationTitle, .navigationBarTitleDisplayMode, .toolbar และ .searchable สำหรับ iOS 16+ Apple ได้แนะนำ NavigationStack ซึ่งคง API ของ NavigationView ไว้ แต่เพิ่มการจัดการสแต็กแบบโปรแกรมผ่าน NavigationPath สำหรับโปรเจกต์ที่รองรับ iOS 15 และต่ำกว่า NavigationView ยังคงเป็นตัวเลือกเดียว

NavigationLink คือองค์ประกอบ SwiftUI ที่สร้างการเปลี่ยนไปยังหน้าจอเป้าหมายภายใน NavigationView หรือ NavigationStack เมื่อกด NavigationLink ระบบจะเพิ่มหน้าจอเป้าหมายไปยังสแต็กการนำทาง แอนิเมชันการเปลี่ยนจะเป็น push มาตรฐานจากด้านขวาบน iOS ซึ่งปรับตามแพลตฟอร์ม

swift
struct ContentView: View {
    var body: some View {
        NavigationView {
            List(items) { item in
                NavigationLink(destination: DetailView(item: item)) {
                    Text(item.title)
                }
            }
            .navigationTitle("รายการ")
        }
    }
}

struct DetailView: View {
    let item: Item

    var body: some View {
        VStack {
            Text(item.description)
                .navigationTitle(item.title)
                .navigationBarTitleDisplayMode(.inline)
        }
    }
}

NavigationLink รับพารามิเตอร์สองตัว: destination — View เป้าหมาย และ label — องค์ประกอบที่ผู้ใช้กด สำหรับรายการ ไวยากรณ์กับ value และ NavigationLink(value:) สะดวก — มันจะยกเลิกการเลือกเซลล์โดยอัตโนมัติและทำงานกับ NavigationPath

กับ iOS 16 Apple ได้แนะนำ NavigationStack เพื่อแทนที่ NavigationView NavigationStack คงไวยากรณ์แบบประกาศไว้ แต่เพิ่มคุณสมบัติที่สำคัญอย่างยิ่ง — การจัดการสแต็กแบบโปรแกรมผ่านคุณสมบัติ path ชนิด NavigationPath หรืออาร์เรย์ของ Hashable

คุณสมบัติNavigationView (iOS 13-15)NavigationStack (iOS 16+)
Push แบบโปรแกรมไม่, ผ่าน NavigationLink เท่านั้นได้, ผ่าน path.append(value)
popToRootเฉพาะ dismiss ไปที่ rootpath.removeLast(path.count)
Deep Linksการนำไปใช้ที่ซับซ้อนรองรับในตัวผ่าน path
การกำหนดชนิดสแต็กไม่ (View ใดก็ได้ใน destination)ได้ (อาร์เรย์ของค่า Hashable)
SplitView iPadColumnStyle / StackStyleNavigationSplitView (iOS 16+)

สำหรับโปรเจกต์ที่มีเวอร์ชันขั้นต่ำ iOS 16+ ให้ใช้ NavigationStack สำหรับรองรับ iOS 14-15 — NavigationView NavigationStack ไม่มีสิ่งที่คล้ายกันโดยตรงสำหรับเวอร์ชันเก่า ดังนั้นการอัปเกรดต้องตรวจสอบความเข้ากันได้

Toolbar และการกำหนดค่า navigationTitle

ตัวปรับแต่ง .toolbar และ .navigationTitle ควบคุมเนื้อหาของแถบนำทาง .navigationTitle กำหนดหัวเรื่องหน้าจอ .navigationBarTitleDisplayMode เลือกสไตล์: .large (ใหญ่, ค่าเริ่มต้น) หรือ .inline (กะทัดรัด, เหมือนในการตั้งค่า) .toolbar เพิ่มปุ่ม ค้นหา และการควบคุมแบบแบ่งส่วน

swift
struct SettingsView: View {
    var body: some View {
        NavigationStack {
            Form {
                Section("โปรไฟล์") {
                    Text("ชื่อผู้ใช้")
                    Toggle("การแจ้งเตือน", isOn: $notifications)
                }
            }
            .navigationTitle("การตั้งค่า")
            .navigationBarTitleDisplayMode(.large)
            .toolbar {
                ToolbarItem(placement: .navigationBarTrailing) {
                    Button("บันทึก") { save() }
                }
                ToolbarItem(placement: .navigationBarLeading) {
                    EditButton()
                }
            }
        }
    }
}

.searchable เป็นตัวปรับแต่งอีกตัวที่รวมแถบค้นหาเข้ากับแถบนำทาง ทำงานทั้งกับ NavigationView และ NavigationStack การค้นหาจะซ่อนโดยอัตโนมัติเมื่อเลื่อนและปรากฏเมื่อปัดลง รองรับการกรองรายการผ่าน Binding String

การนำทางแบบโปรแกรมด้วย NavigationPath

NavigationPath เป็นชนิด iOS 16+ ที่แสดงสแต็กการนำทางเป็นชุดของค่า Hashable นักพัฒนาเพิ่มองค์ประกอบไปยัง path สำหรับการเปลี่ยนแบบโปรแกรม และลบออกเพื่อกลับมา NavigationPath รองรับ deep links การแจ้งเตือนแบบ push และการกู้คืนสถานะ

swift
struct AppNavigation: View {
    @State private var path = NavigationPath()

    var body: some View {
        NavigationStack(path: $path) {
            List(categories) { category in
                NavigationLink("หมวดหมู่ \(category.name)",
                               value: category)
            }
            .navigationTitle("หมวดหมู่")
            .navigationDestination(for: Category.self) { category in
                ProductListView(category: category)
            }
            .navigationDestination(for: Product.self) { product in
                ProductDetailView(product: product)
            }
        }

        // การเปลี่ยนแบบโปรแกรมผ่าน deep link
        .onOpenURL { url in
            guard let productId = DeepLinkParser.parse(url) else { return }
            path.append(Product(id: productId))
        }
    }
}

.navigationDestination(for:) ลงทะเบียนชนิดข้อมูลที่จะแสดงหน้าจอ เมื่อค่าในชนิดนี้ถูกเพิ่มไปยัง path ระบบจะสร้าง View เป้าหมายโดยอัตโนมัติ วิธีการนี้แทนที่ NavigationLink(destination:) แบบชัดแจ้งและทำให้การนำทางถูกกำหนดชนิดอย่างเคร่งครัด

NavigationView และ NavigationStack ทำงานบนทุกแพลตฟอร์มของ Apple: iOS, iPadOS, watchOS, tvOS และ macOS พฤติกรรมปรับตามหน้าจอ บน iPad NavigationStack รองรับ NavigationSplitView ซึ่งแทนที่ UISplitViewController จาก UIKit และแสดงสองคอลัมน์บนหน้าจอกว้าง

NavigationSplitView (iOS 16+) แบ่งหน้าจอเป็นแถบด้านข้าง (รายการ) และรายละเอียด บน iPhone แถบด้านข้างจะถูกซ่อน แสดงเฉพาะรายละเอียดผ่าน NavigationLink บน iPad แถบด้านข้างและรายละเอียดจะแสดงพร้อมกันในโหมด split

swift
struct AdaptiveNavigation: View {
    @State private var selectedCategory: Category?

    var body: some View {
        NavigationSplitView {
            List(categories, selection: $selectedCategory) { category in
                Text(category.name)
            }
            .navigationTitle("หมวดหมู่")
        } detail: {
            ProductListView(category: selectedCategory)
        }
    }
}

NavigationSplitView จะเลือกโหมดการแสดงผลที่เหมาะสมที่สุดสำหรับแต่ละอุปกรณ์โดยอัตโนมัติ บน iPhone ในแนวตั้ง — สแต็ก, บน iPad และ iPhone ในแนวนอน — split นักพัฒนาไม่จำเป็นต้องเขียนโค้ดแยกต่างหากสำหรับ size classes ที่แตกต่างกัน

คำถามที่พบบ่อย

ความแตกต่างระหว่าง NavigationView และ NavigationStack คืออะไร?

NavigationView คือ API เก่า (iOS 13-15) รองรับเฉพาะ NavigationLink แบบประกาศ NavigationStack คือ API ใหม่ (iOS 16+) เพิ่ม path สำหรับการนำทางแบบโปรแกรม deep links และสแต็กที่กำหนดชนิดอย่างเคร่งครัด Apple แนะนำ NavigationStack สำหรับโปรเจกต์ใหม่

จะเพิ่มปุ่มในแถบนำทางได้อย่างไร?

ผ่านตัวปรับแต่ง .toolbar กับ ToolbarItem ตัวอย่าง: .toolbar { ToolbarItem(placement: .navigationBarTrailing) { Button('การตั้งค่า') { } } } Placement กำหนดตำแหน่ง: trailing (ขวา), leading (ซ้าย), principal (กลาง)

จะกำหนดค่าหัวเรื่องและสไตล์ได้อย่างไร?

หัวเรื่องกำหนดผ่าน .navigationTitle('หัวเรื่อง') สไตล์ — .navigationBarTitleDisplayMode(.large) หรือ .inline Large — หัวเรื่องใหญ่สไตล์ iOS Music, inline — กะทัดรัด เหมือนในการตั้งค่า สไตล์สามารถเปลี่ยนได้สำหรับแต่ละหน้าจอแยกกัน

จะส่งข้อมูลผ่าน NavigationLink ได้อย่างไร?

สามวิธี: ผ่าน value (NavigationLink(value:item) { Label }, iOS 16+), ผ่าน destination + label, ผ่าน isActive สำหรับการเปลี่ยนแบบโปรแกรม NavigationLink กับ value สะอาดกว่าสำหรับรายการเพราะไม่ต้องสร้าง View เป้าหมายก่อนการเปลี่ยน

สามารถใช้ NavigationView บน watchOS และ tvOS ได้หรือไม่?

ได้ NavigationView และ NavigationStack พร้อมใช้งานบน iOS, iPadOS, watchOS, tvOS และ macOS บน watchOS การนำทางใช้ลำดับชั้นอินเทอร์เฟซกับ Digital Crown, บน tvOS — การป้อนข้อมูลแบบโฟกัสกับรีโมท พฤติกรรมปรับตามแพลตฟอร์มโดยอัตโนมัติ

สรุป

  • NavigationView — คอนเทนเนอร์ SwiftUI สำหรับการนำทางแบบสแต็กพร้อมแถบนำทางอัตโนมัติและปุ่มกลับ
  • NavigationLink — องค์ประกอบการเปลี่ยนหลัก รองรับไวยากรณ์แบบประกาศ (destination) และแบบ value
  • NavigationStack (iOS 16+) แทนที่ NavigationView เพิ่มการจัดการสแต็กแบบโปรแกรมผ่าน NavigationPath
  • .toolbar เพิ่มปุ่มในแถบนำทาง, .navigationTitle กำหนดหัวเรื่องพร้อมเลือกสไตล์ large/inline
  • NavigationPath — สแต็กที่กำหนดชนิดอย่างเคร่งครัดของค่า Hashable สำหรับการนำทางแบบโปรแกรมและ deep links
  • NavigationSplitView (iOS 16+) ปรับอินเทอร์เฟซสำหรับ iPad และ iPhone เลือก split หรือสแต็กโดยอัตโนมัติ
  • การเลือกระหว่าง NavigationView และ NavigationStack ถูกกำหนดโดยเวอร์ชัน iOS ขั้นต่ำที่รองรับในโปรเจกต์

เราจะพัฒนาแอปพลิเคชันบนมือถือแบบครบวงจร

IT Sectr สร้างแอปพลิเคชัน iOS และ Android สำหรับสตาร์ทอัพและธุรกิจตั้งแต่ปี 2017 เราจะให้คำแนะนำและเสนอวิธีแก้ปัญหาที่ดีที่สุดแก่คุณ

ปรึกษาโครงการ

อ่านเพิ่มเติม