我将UIHostingViewController添加到我的Storyboard并为此创建类。在控制器初始化中加载mySwiftUIView。一切正常。
但是我想使托管控制器像mySwiftUIView的委托一样,因为我想处理视图中的按钮按下。
required init?(coder: NSCoder) {
var mySwiftView = MySwiftUIView()
mySwiftView.delegate = self //self used before super.init call
super.init(coder: coder,rootView: mySwiftView)
}
ID不起作用,因为在托管控制器完全初始化之前我通过了视图。Swift显示消息“ super.init调用之前已使用过”
如果我将使用通常的UIViewController并将HostingController放入其中-这是可行的。但这不适合我,因为它会引起尺寸和导航问题。
如何使用单独的UIHostingController做到这一点。谢谢
完整的代码
import UIKit
import SwiftUI
protocol MySwiftUIViewDelegate{
func buttonPressed()
}
struct MySwiftUIView: View {
var delegate: MySwiftUIViewDelegate?
var body: some View {
Button(action: {
delegate?.buttonPressed()
}) {
Text("My button")
}
}
}
class MyHostingViewController: UIHostingController<MySwiftUIView>, MySwiftUIViewDelegate {
required init?(coder: NSCoder) {
var mySwiftView = MySwiftUIView()
//mySwiftView.delegate = self //self used before super.init call
super.init(coder: coder,rootView: mySwiftView)
}
override func viewDidLoad() {
super.viewDidLoad()
}
func buttonPressed() {
performSegue(withIdentifier: "GoToOtherScreenSegue", sender: self)
}
}
由于MyHostingViewController
知道它rootView
是MySwiftUIView
,因此你可以在之后将视图控制器分配为委托:
required init?(coder: NSCoder) {
var mySwiftView = MySwiftUIView()
super.init(coder: coder, rootView: mySwiftView)
rootView.delegate = self
}
有用。谢谢!)
请注意,您不能执行此操作,
mySwiftView.delegate = self
因为它是按值复制的结构,因此“真实”视图(rootView
)将不设置委托。也mySwiftView
可以在let
这里。