美文网首页SwiftUI
SwiftUI 13-与 UIKit 协作

SwiftUI 13-与 UIKit 协作

作者: 黄花菜先生 | 来源:发表于2025-07-27 09:22 被阅读0次

SwiftUI 与 UIKit 共存仍是许多项目的实际需求。本章讲解如何集成现有 UIKit 控件,双向通信机制,以及在 UIKit App 中引入 SwiftUI 视图。

一. 集成现有 UIKit 控件

SwiftUI 提供协议 UIViewRepresentableUIViewControllerRepresentable,可将 UIKit 视图或控制器封装为 SwiftUI 组件。

示例:将 UISlider 集成到 SwiftUI

import SwiftUI
import UIKit

struct SliderView: UIViewRepresentable {
    @Binding var value: Float

    func makeUIView(context: Context) -> UISlider {
        let slider = UISlider(frame: .zero)
        slider.minimumValue = 0
        slider.maximumValue = 100
        slider.addTarget(context.coordinator, action: #selector(Coordinator.valueChanged(_:)), for: .valueChanged)
        return slider
    }

    func updateUIView(_ uiView: UISlider, context: Context) {
        uiView.value = value
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(value: $value)
    }

    class Coordinator: NSObject {
        var value: Binding<Float>

        init(value: Binding<Float>) {
            self.value = value
        }

        @objc func valueChanged(_ sender: UISlider) {
            value.wrappedValue = sender.value
        }
    }
}

二. 双向通信原理

  • 通过 @Binding 把 SwiftUI 状态绑定传入 UIKit 控件。
  • UIKit 控件事件回调触发 Coordinator 内方法,更新绑定状态。
  • SwiftUI 监听绑定变化,刷新视图。

这种桥接方式保证了数据双向同步。

三. UIKit App 引入 SwiftUI View

在传统 UIKit 项目中,可以直接使用 UIHostingController 包装 SwiftUI 视图。

示例:

import UIKit
import SwiftUI

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        let swiftUIView = Text("Hello from SwiftUI!")
            .padding()
            .font(.title)

        let hostingController = UIHostingController(rootView: swiftUIView)

        addChild(hostingController)
        hostingController.view.frame = view.bounds
        view.addSubview(hostingController.view)
        hostingController.didMove(toParent: self)
    }
}

你可以将任何 SwiftUI 视图嵌入 UIKit 界面,灵活混合使用两者优势。

四. 小结

  • UIViewRepresentable 允许把 UIKit 视图封装成 SwiftUI 组件,便于复用现有代码。
  • 通过 Coordinator@Binding 实现双向通信,保证状态同步。
  • UIKit 项目中用 UIHostingController 嵌入 SwiftUI 界面,实现渐进式迁移。
  • 掌握协作方式,有助于平滑过渡及整合旧项目。

相关文章

网友评论

    本文标题:SwiftUI 13-与 UIKit 协作

    本文链接:https://www.haomeiwen.com/subject/gyxgnjtx.html