KVKFlowCoordinators 0.2.2

KVKFlowCoordinators 0.2.2

Sergei Kviatkovskii 维护。



SwiftPM compatible License

要求

  • iOS 16.0+, iPadOS 16.0+, MacOS 13.0+ (支持 Mac Catalyst)
  • Swift 5.0+

安装

Swift Package Manager (Xcode 12 或更高版本)

  1. 在Xcode中,导航到 文件Swift包添加包依赖...
  2. 选择一个项目
  3. 粘贴仓库URL(https://github.com/kvyatkovskys/KVKFlowCoordinators)并点击 下一步
  4. 对于 规则,选择 版本(直到下一个主要版本) 并点击 下一步
  5. 点击 完成

将包依赖添加到您的应用中

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()
    }
}

作者

Sergei Kviatkovskii

许可证

KVKFlowCoordinators 在MIT许可证下可用。