【问题标题】:SwiftUI - Presenting alerts, dialogs from ViewsSwiftUI - 从视图中呈现警报、对话框
【发布时间】:2021-01-06 02:22:09
【问题描述】:

我在 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()
    }

所以我想将 View Controller 引用传递给其他 View。

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

【问题讨论】:

    标签: ios uiviewcontroller swiftui presentviewcontroller uiwindowscene


    【解决方案1】:

    可能的解决方案是将托管视图控制器作为环境键注入,因此它可以在任何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))
            }
        }
    }
    

    【讨论】:

    • 它发生在 ContentView 中,当使用 viewController 变量来呈现某些东西时,它是 nil。你能帮忙吗?
    【解决方案2】:

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

    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 的回答:

    Get top most UIViewController

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多