gpt4 book ai didi

ios - 从托管 View Controller 委托(delegate) SwiftUI View

转载 作者:行者123 更新时间:2023-12-04 03:46:26 25 4
gpt4 key购买 nike

我将 UIHostingViewController 添加到我的 Storyboard 并为此创建类。在 Controller 初始化中加载 mySwiftUIView。一切正常。

但我想让托管 Controller 像 mySwiftUIView 的委托(delegate)一样,因为我想处理 View 中的按钮按下。

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

Id 不起作用,因为我在托管 Controller 完全初始化之前通过了 View 。 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)
}
}

最佳答案

由于 MyHostingViewController 知道它的 rootViewMySwiftUIView,您可以随后将 View Controller 指定为委托(delegate):

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

关于ios - 从托管 View Controller 委托(delegate) SwiftUI View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65076243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com