如何通过回调闭包将数据从SwiftUI视图传递到UIKit ViewController
解决方案
你只需要修改回调闭包的定义,把需要传递的数据作为闭包的入参即可,不需要额外访问rootView属性。
1. 修改MyView的闭包声明与调用逻辑
原来的无参数闭包调整为带String类型参数的闭包,点击按钮触发回调时直接把someData作为参数传入:
import SwiftUI struct MyView: View { // 调整闭包定义,增加参数位接收要传递的数据 var buttonPressed: ((String) -> Void)? @State var someData = "" var body: some View { ZStack { Color.purple Button(action: { someData = "new Data" // 触发回调时直接把数据作为参数传入 self.buttonPressed?(someData) }) { Text("Button") } } } } struct MyView_Previews: PreviewProvider { static var previews: some View { MyView() } }
2. 调整ViewController中的回调接收逻辑
此时闭包会直接携带传递过来的参数,直接接收使用即可:
import UIKit import SwiftUI class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let swiftUIView = MyView() let hostingViewController = UIHostingController(rootView: swiftUIView) self.view.addSubview(hostingViewController.view) hostingViewController.view.translatesAutoresizingMaskIntoConstraints = false hostingViewController.view.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true hostingViewController.view.bottomAnchor.constraint(equalTo: self.view.bottomAnchor).isActive = true hostingViewController.view.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true hostingViewController.view.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true // 直接接收回调传来的参数即可,不需要访问rootView hostingViewController.rootView.buttonPressed = { receivedData in print ("收到回调,携带数据:\(receivedData)") } } }
如果需要传递多个不同类型的数据,可以自定义结构体作为闭包的参数类型,代码会更易维护。
内容的提问来源于stack exchange,提问作者Degtiarev Aleksei
相关产品推荐
相关产品推荐

