我的应用程序是UIKit
&的混合体SwiftUI
。我有一个用例,用户可能需要Button
从 a 中点击 aSwiftUI.View
但推送到 aUIViewController
或 another UIHostingController
。
我的项目使用Storyboard
.
我正在使用UINavigationController
& UITabBarController
。
我正在研究两种情况。
1.) 从我在主屏幕上首次启动时,我可以点击一个按钮,在它的操作中我有:
let vc = UIHostingController(rootView: RootView())
self.navigationController?.pushViewController(vc, animated: true)
这按预期工作。
2.) 我点击另一个选项卡,它默认为我的SwiftUI
RootView,它托管在UIHostingController
我在我的Storyboard
. 在这里,如果我点击一个按钮来触发推送,它不会推送。我只看到View
我正在更新。
我也在使用自定义UINavigationController
. 从我Storyboard
的角度来看,选项卡关系转到自定义UINavigationController
,然后它的根是适当的UIViewController
。在一种情况下,虽然它是我的自定义,所以我最初可以从选项卡选择UIHostingController
中加载一个视图。SwiftUI
这是我尝试处理从 SwiftUI 视图推送到视图控制器的操作:
final class AppData: ObservableObject {
weak var window: UIWindow? // Will be nil in SwiftUI previewers
init(window: UIWindow? = nil) {
self.window = window
}
public func pushViewController(_ viewController: UIViewController, animated: Bool = true) {
let nvc = window?.rootViewController?.children.first?.children.first as? UINavigationController
nvc?.pushViewController(viewController, animated: animated)
}
}
// This is what is triggered from the Button action.
func optionSelected(option: String) {
if let optionId = Common.getIDByOption(option: option) {
let vc = UIHostingController(rootView: RootView())
appData.pushViewController(vc, animated: true)
}
}
怎么了:
- 我确实看到数据发生了变化,但它们都在我已经使用的同一个视图上。
- 我需要推送到新的
UIHostingController
.