Swift 从主机控制器返回到故事板中的另一个控制器
我有一个带有Swift 从主机控制器返回到故事板中的另一个控制器,swift,swiftui,uikit,storyboard,Swift,Swiftui,Uikit,Storyboard,我有一个带有情节提要的项目,但现在我要迁移到SwiftUI 我有一个主机控制器来控制del SwiftUI段,但现在我需要从情节提要返回到另一个控制器 基本上我可以做到这一点:Storyboard(controller1)->HostingController(SwiftUI)。 现在我需要返回:HostingController(SwiftUI)->情节提要(controller2)我喜欢使用闭包。我想你是这样介绍主机控制器的吧 let viewController = UIHostingCo
情节提要
的项目,但现在我要迁移到SwiftUI
我有一个主机控制器
来控制del SwiftUI段,但现在我需要从情节提要
返回到另一个控制器
基本上我可以做到这一点:Storyboard(controller1)
->HostingController(SwiftUI)
。
现在我需要返回:
HostingController(SwiftUI)
->情节提要(controller2)
我喜欢使用闭包。我想你是这样介绍主机控制器的吧
let viewController = UIHostingController(rootView: ContentView())
self.present(viewController, animated: true)
您可以在SwiftUI视图结构中添加闭包dismisself
:
struct ContentView: View {
var dismissSelf: (() -> Void)?
var body: some View {
Button(action: {
dismissSelf?()
}) {
Text("Return")
}
}
}
按下按钮时,将调用dismisself
。现在,您需要将dismisself
分配给解除UIHostingController
的代码块。您可以这样做:
class ViewController: UIViewController {
@objc func buttonPressed() {
var viewController: UIViewController?
let contentView = ContentView {
/// set the closure (it's a trailing closure, so you don't need to put the `dismissSelf`)
viewController?.dismiss(animated: true, completion: nil)
}
viewController = UIHostingController(rootView: contentView)
if let vc = viewController {
self.present(vc, animated: true, completion: nil)
}
}
/// make the button
override func viewDidLoad() {
super.viewDidLoad()
let button = UIButton(frame: CGRect(x: 50, y: 50, width: 80, height: 40))
button.setTitle("Present", for: .normal)
button.setTitleColor(.blue, for: .normal)
button.addTarget(self, action: #selector(buttonPressed), for: .touchUpInside)
view.addSubview(button)
}
}
这件事有一点让人恶心viewController
永远不会为零,但为了避免强制展开,我在let中加入了一个
结果:
很好,但我需要的是转到另一个与第一个不同的ViewCotroller
。另请注意,我通过IBSegueAction
@Playa调用了主机控制器
,您可以显示IBSegueAction
的代码吗?另外,您想要的导航流程是什么?是否要关闭显示的宿主控制器并将父视图替换为不同的视图控制器,或在宿主控制器的“顶部”显示该不同的视图控制器?