SwiftUI-从视图中显示警报、对话框



我在SwiftUI中创建了一个应用程序。

视图是结构化的,但我需要了解视图控制器,因为它是显示一些特殊警报所必需的。

我看到在我的项目中有AppDelegate和SceneDelegate。

我发现了这个

let contentView = ContentView()
// Use a UIHostingController as window root view controller.
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView)
self.window = window
window.makeKeyAndVisible()
}

因此,我想将视图控制器引用传递给其他视图。

window.rootViewController是要传递和使用的正确值吗?

可能的解决方案是注入宿主视图控制器作为环境密钥,因此它可以在任何ContentView内部层次结构级别上使用。

这是一个演示。使用Xcode 12/iOS 14进行测试。

  1. 声明环境密钥
struct RootViewControllerKey: EnvironmentKey {
static let defaultValue: UIViewController? = nil
}
extension EnvironmentValues {
var rootViewController: UIViewController? {
get { self[RootViewControllerKey.self] }
set { self[RootViewControllerKey.self] = newValue }
}
}
  1. 将环境注入ContentView
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
let rootController = UIHostingController(rootView: AnyView(EmptyView()))
rootController.rootView = AnyView(contentView
.environment(.rootViewController, rootController))
window.rootViewController = rootController
self.window = window
window.makeKeyAndVisible()
}
  1. 内部使用
struct ContentView: View {
// can be used here as well
var body: some View {
TestSubView()
}
}
struct TestSubView: View {
@Environment(.rootViewController) var viewController // for demo here!!
var body: some View {
Text("Demo")
.onAppear {
print(String(describing: self.viewController))
}
}
}

我不知道这个答案是否是一个合适的解决方案,但它对我来说很有效,所以使用它时要小心。

class func getTopMostViewController() -> UIViewController? {
var topMostViewController = UIApplication.shared.keyWindow?.rootViewController
while let presentedViewController = topMostViewController?.presentedViewController {
topMostViewController = presentedViewController
}
return topMostViewController
}

使用类似的值

let viewController=getTopMostViewController()
viewController.present(...

来自StackOverflow的答案:

获取最热门的UIViewController

相关内容

  • 没有找到相关文章

最新更新