【发布时间】:2021-08-24 22:32:18
【问题描述】:
这是我第一次使用 SwiftUI,我已经搜索过这个问题,但没有找到任何可行的解决方案,所以我将不胜感激。
我有一个 UIViewController,我在其中通过 UIHostingController 呈现一个 SwiftUI 视图。我想要实现的是,当我在 SwiftUI 视图中按下按钮时,该操作将触发 UIViewController 中的委托,或者,触发 UIViewController 中的一个函数,然后从该函数触发委托。
class MyViewController: UIViewController {
public var delegate: MyViewControllerDelegate?
let facialView = UIHostingController(rootView: FacialTutorial())
override func viewWillAppear(_ animated: Bool) {
addChild(facialView)
view.addSubview(facialView.view)
setupConstraints()
}
extension MyViewController {
@objc private func buttonPressed() {
delegate?.buttonPressed()
}
}
}
在我的 SwiftUI 视图中 FacialTutorial
struct FacialTutorial: View {
var body: some View {
VStack() {
Button {
// I want to call delegate?.buttonPressed() action here
} label: {
Text("Press button")
}
}
}
}
编辑
好吧,说得更清楚些,我的 ViewController 在很多情况下对页面进行了不同的配置。所以在实践中,我不会从 viewWillAppear 启动 SwiftUI 视图。相反,我就是这样做的
public var delegate: MyViewControllerDelegate?
let facialView = UIHostingController(rootView: FacialTutorial())
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
addChild(facialView)
configureSubviews()
}
private func configureForInstructionMode() {
view.addSubview(facialUIView.view)
setupConstraints()
}
我必须采用这种方式,因为我需要根据要配置的模式来不同地配置视图。当我在 viewDidLoad 或 viewWillAppear 中声明 faceView 时,我无法访问 configureForInstructionMode() 中的实例,或者它的值为 nil..
【问题讨论】: