检查是否有导航,并从 SwiftUI 视图呈现和推送
Check if there is navigation, and present and push from a SwiftUI view
我正在试验 SwiftUI。我已经有一个基于 UIKit 的应用程序在运行,我想集成一个 SwiftUI 视图。我通过使用 UIHostingController 来显示这个 SwiftUI 视图。
在这个 SwiftUI 中,我拦截了一个按钮操作。在这个动作中,我想:
- 检查是否有导航控制器(它在 UIKit 上曾经是 self.navigationController)
- 能够从此 SwiftUI 视图呈现或推送(通过 self.navigationController)一个新的 UIKit 视图控制器。
我找不到任何方法在 SwiftUI 上实现这三件事中的任何一件
您可以通过多种方式做到这一点:委托、闭包,甚至与联合发布者合作。我认为最简单的入门方法是使用动作关闭。它可能看起来像这样:
struct SwiftUIView: View {
let action: () -> Void
var body: some View {
Button("press me", action: action)
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let swiftUIView = SwiftUIView(action: handleButtonPress)
let hostingController = UIHostingController(rootView: swiftUIView)
addChild(hostingController)
hostingController.view.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(hostingController.view)
NSLayoutConstraint.activate([
hostingController.view.topAnchor.constraint(equalTo: view.topAnchor),
hostingController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor),
hostingController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
hostingController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor)
])
}
func handleButtonPress() {
print("TODO: Insert navigation controller logic here")
}
}
我正在试验 SwiftUI。我已经有一个基于 UIKit 的应用程序在运行,我想集成一个 SwiftUI 视图。我通过使用 UIHostingController 来显示这个 SwiftUI 视图。
在这个 SwiftUI 中,我拦截了一个按钮操作。在这个动作中,我想:
- 检查是否有导航控制器(它在 UIKit 上曾经是 self.navigationController)
- 能够从此 SwiftUI 视图呈现或推送(通过 self.navigationController)一个新的 UIKit 视图控制器。
我找不到任何方法在 SwiftUI 上实现这三件事中的任何一件
您可以通过多种方式做到这一点:委托、闭包,甚至与联合发布者合作。我认为最简单的入门方法是使用动作关闭。它可能看起来像这样:
struct SwiftUIView: View {
let action: () -> Void
var body: some View {
Button("press me", action: action)
}
}
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let swiftUIView = SwiftUIView(action: handleButtonPress)
let hostingController = UIHostingController(rootView: swiftUIView)
addChild(hostingController)
hostingController.view.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(hostingController.view)
NSLayoutConstraint.activate([
hostingController.view.topAnchor.constraint(equalTo: view.topAnchor),
hostingController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor),
hostingController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
hostingController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor)
])
}
func handleButtonPress() {
print("TODO: Insert navigation controller logic here")
}
}