【问题标题】:Delegate for SwiftUI View from Hosting View Controller从托管视图控制器委托 SwiftUI 视图
【发布时间】:2021-03-12 12:47:27
【问题描述】:

我将 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 显示消息“self used before super.init call”

如果我将使用通常的 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)
}
}

【问题讨论】:

    标签: ios swift swiftui uikit uihostingcontroller


    【解决方案1】:

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

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

    【讨论】:

    • 请注意,您不能执行mySwiftView.delegate = self,因为它是按值复制的结构,因此“真实”视图 (rootView) 不会设置委托。 mySwiftView 也可以是 let 这里。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    • 2013-06-04
    • 2019-02-22
    • 1970-01-01
    相关资源
    最近更新 更多