SwiftUI flow coordinator 用于控制您的 App 中的导航。
要求
- iOS 16.0+, iPadOS 16.0+, MacOS 13.0+ (支持 Mac Catalyst)
- Swift 5.0+
安装
Swift Package Manager (Xcode 12 或更高版本)
- 在Xcode中,导航到 文件 → Swift包 → 添加包依赖...
- 选择一个项目
- 粘贴仓库URL(
https://github.com/kvyatkovskys/KVKFlowCoordinators
)并点击 下一步。 - 对于 规则,选择 版本(直到下一个主要版本) 并点击 下一步。
- 点击 完成。
SwiftUI使用方法
- 导入
KVKFlowCoordinators
。 - 创建一个具有导航类型的实体(例如,
enum SheetType: FlowTypeProtocol
)。 - 如果您想使用
.sheet
、.navigationDestination
、.fullScreenCover
,则创建一个继承自FlowCoordinator
基类的协调器。或者使用特定的协调器类SheetCoordinator, LinkCoordinator, CoverCoordinator, SheetAndLinkCoordinator, SheetAndCoverCoordinator, LinkAndCoverCoordinator
。 - 如果您需要,创建一个
ViewModel
。 - 使用创建的协调器创建一个
CoordinatorView
。
要使用 navigationLink,请使用 .navigationDestination(for: NavigationLinkType.self)
。 .navigationDestination(item: $item)
不起作用。
final class ContentCoordinator: FlowCoordinator<ContentViewModel.SheetType, ContentViewModel.LinkType, ContentViewModel.CoverType> {
@Published var vm: ContentViewModel!
private(set) var secondContentCoordinator: SecondContentCoordinator!
init() {
super.init()
vm = ContentViewModel(coordinator: self)
secondContentCoordinator = SecondContentCoordinator(parentCoordinator: self, title: "Second Coordinator")
}
}
struct ContentCoordinatorView: View {
@StateObject private var coordinator = ContentCoordinator()
var body: some View {
NavigationStack(path: $coordinator.path) {
ContentView(vm: coordinator.vm)
.fullScreenCover(item: $coordinator.coverType, content: { (item) in
SheetView(title: "Cover View")
})
.sheet(item: $coordinator.sheetType) { (item) in
switch item {
case .sheetFirst(let title):
SheetView(title: title)
}
}
.navigationDestination(for: NavigationLinkType.self) { (item) in
switch item {
case .linkFirstWithParams(let title):
NavigationLinkView(title: title)
case .linkSecond:
NavigationLinkView(title: "Test Second Link")
case .linkSecondCoordinator:
SecondContentCoordinatorView(coordinator: coordinator.secondContentCoordinator)
}
}
}
}
}
final class ContentViewModel: ObservableObject {
private let coordinator: ContentCoordinator
init(coordinator: ContentCoordinator) {
self.coordinator = coordinator
}
func openFirstLink() {
coordinator.linkType = .linkFirstWithParams("First Link View")
}
}
struct ContentView: View {
@ObservedObject var vm: ContentViewModel
var body: some View {
VStack(spacing: 30) {
Image(systemName: "globe")
.imageScale(.large)
.foregroundStyle(.tint)
Text("Hello, world!")
Button("Open Sheet") {
vm.openSheetFirst(autoClose: false)
}
Button("Open Auto Close Sheet") {
vm.openSheetFirst(autoClose: true)
}
Button("Open Cover") {
vm.openCoverFirst()
}
Button("Open Link First") {
vm.openFirstLink()
}
Button("Open Complex Btn Link") {
vm.openComplexLink()
}
NavigationLink("Open Complex Nav Link",
value: ContentViewModel.LinkType.linkSecondCoordinator)
}
.padding()
}
}
作者
许可证
KVKFlowCoordinators 在MIT许可证下可用。