堆栈导航

堆栈导航是一个用于 UIKit 和 SwiftUI 的库,它基于路径状态显示目标视图,类似于 SwiftUI 的 NavigationStack。

堆栈导航是一个用于 UIKit 和 SwiftUI 的库,它基于路径状态显示目标视图,类似于 SwiftUI 的 NavigationStack。

要求

使用方法

与 SwiftUI 一起使用

基于堆栈的导航(全局目标视图)

  1. 添加数据集合属性。

    添加数据集合属性。

@State private var presentedParks: [Park] = []
  1. 将 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)
  }
}

基于树的导航(本地目标视图)

  1. 添加布尔属性。

    添加布尔属性。

@State private var showDetails = false
var park: Park
  1. 在 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)

与 UIKit 一起使用

基于堆栈的导航(全局目标视图)

  1. 在容器(如 AppDelegate、ViewController 等)中初始化导航。

    在容器(如 AppDelegate、ViewController 等)中初始化导航。

let navigationController = StackNavigationController(
  rootViewController: rootViewController,
  initialPath: viewModel.presentedParks,
  destination: { ParkDetailsViewController(park: $0) }
)
  1. 如果要在路径更改时更改状态,请使用 StackNavigationControllerDelegate。

    如果要在路径更改时更改视图模型的状态,请使用 StackNavigationControllerDelegate。

extension AppDelegate: StackNavigationControllerDelegate {
  func navigationController(didChangePath changedPath: [Park]) {
    viewModel.presentedParks = changedPath
  }
}
  1. 当视图模型的路径更改时,调用 updateStacks(using:) 方法以更新视图。

    当视图模型的路径更改时,调用 updateStacks(:) 方法以更新视图。

let pathUpdate = viewModel.$presentedParks
  .sink { [weak navigationController] newPath in
    navigationController?.updateStacks(newPath)
  }

基于树的导航(本地目标视图)

照常使用 pushViewController。

照常使用 pushViewController。

在 UIKit 和 SwiftUI 之间移动(基于树)

从 UIViewController 推送 SwiftUI 视图

使用 SwiftUI 视图创建 NavigationBindingController 并推送它。

使用 SwiftUI 视图创建 NavigationBindingController 并推送它。

let parkDetailsView: some View = ParkDetails(park: park)
let bindingController = NavigationBindingController(content: parkDetailsView)
navigationController?.pushViewController(bindingController, animated: true)

从 SwiftUI 视图推送 UIViewController

使用 snNavigationDestination(isPresented:destinationViewController:) 修饰符定义目标视图控制器。

使用 snNavigationDestination(isPresented:destinationViewController:) 修饰符定义目标视图控制器。

content
  .snNavigationDestination(isPresented: $showDetails) {
    ParkDetailsViewController(park: park)
  }

待办事项