(※ iOS 16+ 지원)
NavigationView의 역할을 기본적으로 하고 있으며, 약간의 포맷이 달라졌다.
// NavigationStack
NavigationStack {
List(parks) { park in
NavigationLink(park.name, value: park)
}
.navigationDestination(for: Park.self) { park in
ParkDetailView(park: park)
}
}
// NavigationView
NavigationView {
List(parks) { park in
NavigationLink(destination: ParkDetailView(park: park)) {
Text(park.name)
}
}
}
NavigationStack에는 path라는 @Binding을 통해 Navigation State를 관리할 수 있으며, 상황에 따라 일부 혹은 변화된 Navigation State만 보여줄 수 있는 장점이 있다.
@State private var presentedPark: [Park] = []
func showParks() {
presentedPark = [Park("Yosemite"), Park("Olympic Park")]
}
NavigationStack(path: $presentedPark) {
List(parks) { park in
NavigationLink(park.name, value: park)
}
.navigationDestination(for: Park.self) { park in
ParkDetailView(park: park)
}
}
NavigationPath라는 인스턴스를 사용하면 타입(ex. Int, String)이 서로 다른 Destination으로 이동할 수 있다. navigationDestination 은 NavigationStack 안에서 정의되어야 하며, for에는 사용될 타입을 정의해줘야 한다. 상당히 화면이 복잡한 앱에서 유용하게 사용될 듯하다.
@State private var presentedNumbers = NavigationPath()
NavigationStack(path: $presentedNumbers) {
NavigationLink(value: "Example String") {
Text("Tap Me")
}
List(1..10) { i in
NavigationLink(value: i) {
Text("Row: \(i)")
}
}
.navigationDestination(for: Int.Self) { i in
Text("Int Detail: \(i)")
}
.navigationDestination(for: String.Self) { s in
Text("String Detail: \(s)")
}
}
2~3개 컬럼을 가지는 경우 NavigationSplitView를 사용할 수 있다. 주로 iPad에서 사용할 것 같고, 여러 번 선택해야 하는 경우에 유용할 것으로 보인다. ex. A,B,C 선택에 따라 칼럼 값을 다르게 보여줘야하는 경우
@State private var departmentId: Department.ID? // Single selection.
@State private var employeeIds: Set<Employee.ID> = [] // Multiple selection.
var body: some View {
NavigationSplitView {
List(model.departments, selection: $departmentId) { department in
Text(department.name) // 첫 칼럼 선택
}
} content: {
if let department = model.department(id: departmentId) {
List(department.employees, selection: $employeeIds) { employee in
Text(employee.name) // 두번째 칼럼 선택
}
} else {
Text("Select a department")
}
} detail: {
EmployeeDetails(for: employeeIds)
}
}
다양한 Customize를 지원하고 있다.
leading 칼럼의 가시성을 컨트롤할 수 있다.
칼럼의 너비를 자유롭게 조정할 수 있음
NaivationSplitViewStyle을 통해서 NaivationSplitView의 모양과 상호작용을 컨트롤할 수 있다.
SwiftUI 초창기부터 사용되었던 NavigationView는 iOS 16버전까지만 지원되고 Deprecated될 예정(..!)
공식 문서에 따르면, 위의 NavigationStack과 NavigationSplitView로 대체하여 사용할 것을 권장하며, 아마도 NavigationView의 한계점을 느끼고 다양하게 커스텀할 수 있는 강력한 기능을 제공하기 위함으로 생각된다.

참고 문서