Warm tip: This article is reproduced from serverfault.com, please click

ios-从Hosting View Controller委托SwiftUI View

(ios - Delegate for SwiftUI View from Hosting View Controller)

发布于 2020-11-30 15:19:19

我将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)
}
}
Questioner
Ivan
Viewed
0
EDUsta 2020-11-30 23:35:06

由于MyHostingViewController知道它rootViewMySwiftUIView,因此你可以在之后将视图控制器分配为委托:

required init?(coder: NSCoder) {
    var mySwiftView = MySwiftUIView()
    super.init(coder: coder, rootView: mySwiftView)
    rootView.delegate = self
}