[英]SwiftUI go to another view from UIViewController
我有一個用 SwiftUI 構建的項目,為了能夠使用條紋,我現在正在將 UIKit 集成到這個 SwiftUI 項目中。 這是我想做的一個例子。 我想從 UIKit 轉到另一個視圖。 這是我在 SwiftUI 中的內容視圖。 如果您復制粘貼此代碼,它也適用於您的 xcode。
import SwiftUI
import UIKit
struct ContentView: View {
var body: some View {
ViewControllerWrapper(controller: MyViewController.init())
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
class MyViewController: UIViewController{
lazy var goToAnotherViewButton: UIButton = {
let button = UIButton(type: .custom)
button.layer.cornerRadius = 5
button.backgroundColor = .systemYellow
button.titleLabel?.font = UIFont.systemFont(ofSize: 22)
button.setTitle("Go", for: .normal)
button.addTarget(self, action: #selector(goToAnotherView), for: .touchUpInside)
return button
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
let stackView = UIStackView(arrangedSubviews: [goToAnotherViewButton])
stackView.axis = .vertical
stackView.spacing = 20
stackView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(stackView)
NSLayoutConstraint.activate([
stackView.leftAnchor.constraint(equalToSystemSpacingAfter: view.leftAnchor, multiplier: 2),
view.rightAnchor.constraint(equalToSystemSpacingAfter: stackView.rightAnchor, multiplier: 2),
stackView.topAnchor.constraint(equalToSystemSpacingBelow: view.topAnchor, multiplier: 2),
])
}
@objc
func goToAnotherView() {
//from this function I want to go to Another View
}
}
struct ViewControllerWrapper: UIViewControllerRepresentable{
func makeUIViewController(context: UIViewControllerRepresentableContext<ViewControllerWrapper>) -> UIViewController {
guard let controller=controller else {
return UIViewController()
}
return controller
}
func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<ViewControllerWrapper>) {
}
let controller:UIViewController?
typealias UIViewControllerType = UIViewController
}
您可以創建 UIHostingController 的實例並將此控制器推送到導航控制器。
例子:
struct ContentView1: View {
var body: some View {
NavigationView(content: {
ViewControllerWrapper(controller: MyViewController.init())
})
.navigationTitle("View")
.navigationBarTitle("Text")
}
}
struct AnotherView: View {
var body: some View {
Text("AnotherView In Swiftui")
.font(.title)
}
}
struct ContentView1_Previews: PreviewProvider {
static var previews: some View {
ContentView1()
}
}
class MyViewController: UIViewController{
lazy var goToAnotherViewButton: UIButton = {
let button = UIButton(type: .custom)
button.layer.cornerRadius = 5
button.backgroundColor = .systemYellow
button.titleLabel?.font = UIFont.systemFont(ofSize: 22)
button.setTitle("Go", for: .normal)
button.addTarget(self, action: #selector(goToAnotherView), for: .touchUpInside)
return button
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .white
let stackView = UIStackView(arrangedSubviews: [goToAnotherViewButton])
stackView.axis = .vertical
stackView.spacing = 20
stackView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(stackView)
NSLayoutConstraint.activate([
stackView.leftAnchor.constraint(equalToSystemSpacingAfter: view.leftAnchor, multiplier: 2),
view.rightAnchor.constraint(equalToSystemSpacingAfter: stackView.rightAnchor, multiplier: 2),
stackView.topAnchor.constraint(equalToSystemSpacingBelow: view.topAnchor, multiplier: 2),
])
}
@objc
func goToAnotherView() {
//from this function I want to go to Another View
let vc = UIHostingController(rootView: AnotherView())
self.navigationController?.pushViewController(vc, animated: true)
}
}
struct ViewControllerWrapper: UIViewControllerRepresentable{
func makeUIViewController(context: UIViewControllerRepresentableContext<ViewControllerWrapper>) -> UIViewController {
guard let controller=controller else {
return UIViewController()
}
return controller
}
func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<ViewControllerWrapper>) {
}
let controller:UIViewController?
typealias UIViewControllerType = UIViewController
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.