堆栈导航是一个用于 UIKit 和 SwiftUI 的库,它基于路径状态显示目标视图,类似于 SwiftUI 的 NavigationStack。
堆栈导航是一个用于 UIKit 和 SwiftUI 的库,它基于路径状态显示目标视图,类似于 SwiftUI 的 NavigationStack。
添加数据集合属性。
添加数据集合属性。
@State private var presentedParks: [Park] = []
将 StackNavigationView 绑定到数据集合值,并使用 snNavigationDestination(for:destination:)
添加目标视图。
将 StackNavigationView 绑定到数据集合值,并使用 snNavigationDestination(for:destination:)
添加目标视图。
StackNavigationView(path: $presentedParks) {
List(parks) { park in
Button(park.name) {
presentedParks.append(park)
}
}
.snNavigationDestination(for: Park.self) { park in
ParkDetails(park: park)
}
}
添加布尔属性。
添加布尔属性。
@State private var showDetails = false
var park: Park
在 StackNavigationView 内部添加修饰符。
在 StackNavigationView 内部添加修饰符。
StackNavigationView(path: $presentedParks) {
VStack {
Text(park.name)
Button("Show details") {
showDetails = true
}
}
.snNavigationDestination(isPresented: $showDetails) {
ParkDetails(park: park)
}
}
在根视图或目标视图中添加 snNavigationTitle(:)
修饰符。
在根视图或目标视图中添加 snNavigationTitle(:)
修饰符。
content.snNavigationTitle(park.name)
在容器(如 AppDelegate、ViewController 等)中初始化导航。
在容器(如 AppDelegate、ViewController 等)中初始化导航。
let navigationController = StackNavigationController(
rootViewController: rootViewController,
initialPath: viewModel.presentedParks,
destination: { ParkDetailsViewController(park: $0) }
)
如果要在路径更改时更改状态,请使用 StackNavigationControllerDelegate。
如果要在路径更改时更改视图模型的状态,请使用 StackNavigationControllerDelegate。
extension AppDelegate: StackNavigationControllerDelegate {
func navigationController(didChangePath changedPath: [Park]) {
viewModel.presentedParks = changedPath
}
}
当视图模型的路径更改时,调用 updateStacks(using:)
方法以更新视图。
当视图模型的路径更改时,调用 updateStacks(:)
方法以更新视图。
let pathUpdate = viewModel.$presentedParks
.sink { [weak navigationController] newPath in
navigationController?.updateStacks(newPath)
}
照常使用 pushViewController。
照常使用 pushViewController。
使用 SwiftUI 视图创建 NavigationBindingController 并推送它。
使用 SwiftUI 视图创建 NavigationBindingController 并推送它。
let parkDetailsView: some View = ParkDetails(park: park)
let bindingController = NavigationBindingController(content: parkDetailsView)
navigationController?.pushViewController(bindingController, animated: true)
使用 snNavigationDestination(isPresented:destinationViewController:)
修饰符定义目标视图控制器。
使用 snNavigationDestination(isPresented:destinationViewController:)
修饰符定义目标视图控制器。
content
.snNavigationDestination(isPresented: $showDetails) {
ParkDetailsViewController(park: park)
}
NavigationLink(destination:label:)
NavigationLink(value:label:)