返回

SwiftUI 100 天:协调员在 SwiftUI 视图控制器中的作用

IOS

序言

在 SwiftUI 的旅程中,我们曾探索过如何使用 UIViewControllerRepresentable 封装 UIKit 视图控制器,以便在 SwiftUI 中使用它们。我们特别关注了 UIImagePickerController,它允许我们展示图像选择器,让用户可以选择图像。

协调员:管理 SwiftUI 视图控制器

虽然我们可以展示图像选择器,但我们面临一个挑战:我们需要处理图像选择器生命周期的特定方面,例如,当用户选择了图像或取消了选择时。为了解决这个问题,SwiftUI 引入了 Coordinator 类型。协调员是一种机制,它允许我们从 SwiftUI 视图中协调 UIKit 视图控制器的行为。

创建协调员

创建一个协调员需要三个步骤:

  1. 在 SwiftUI 视图中定义协调员类型:
    struct MyView: View {
        ...
        coordinator: Coordinator
        ...
    }
    
  2. 创建一个协调员类并使其遵循 Coordinator 协议:
    class Coordinator: NSObject, UIViewControllerDelegate, UIImagePickerControllerDelegate {
        ...
    }
    
  3. init(context:) 方法中初始化协调员:
    init(context: Context) {
        coordinator = Coordinator(context: context)
    }
    

使用协调员

创建协调员后,我们可以通过 makeCoordinator() 方法访问它:

struct MyView: View {
    ...
    var body: some View {
        ...
        .makeCoordinator()
    }
    ...
}

现在,我们可以通过 coordinator 属性访问协调器,并与 UIKit 视图控制器进行交互:

struct MyView: View {
    ...
    var body: some View {
        ...
        .makeCoordinator()
        .onAppear {
            coordinator.presentImagePickerController()
        }
    }
    ...
}

处理视图控制器事件

协调员允许我们处理视图控制器事件。例如,要处理 UIImagePickerControllerdidFinishPickingMediaWithInfo 事件,可以在协调员类中实现如下方法:

class Coordinator: NSObject, UIViewControllerDelegate, UIImagePickerControllerDelegate {
    ...
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        ...
    }
    ...
}

结论

通过利用协调员,我们可以有效地管理 SwiftUI 中的视图控制器。协调员提供了从 SwiftUI 视图与 UIKit 视图控制器交互的桥梁,使我们能够处理视图控制器生命周期和事件,从而创建出色的用户界面。在 SwiftUI 的旅程中,协调员是不可或缺的工具,它赋予我们控制和响应 UIKit 组件的能力,同时仍受益于 SwiftUI 的声明式和响应式编程范式。