如何检测模态视图在 SwiftUI 中全局可见

Posted

技术标签:

【中文标题】如何检测模态视图在 SwiftUI 中全局可见【英文标题】:How to detect a modal view is visible globally in SwiftUI 【发布时间】:2021-07-30 21:27:36 【问题描述】:

在 SwiftUI 中,有几种方法可以呈现模态视图,例如 .popover

我的背景是我想在其他地方而不是在当前视图页面下展示 UIKit 模式视图

private func presentGlobally(animated: Bool, completion: (() -> Void)?) 
        var rootViewController = UIApplication.shared.rootViewController
        while true 
          if let presented = rootViewController?.presentedViewController 
            rootViewController = presented
           else if let navigationController = rootViewController as? UINavigationController 
            rootViewController = navigationController.visibleViewController
           else if let tabBarController = rootViewController as? UITabBarController 
            rootViewController = tabBarController.selectedViewController
           else 
            break
          
        
        UIApplication.shared.rootViewController?.present(self, animated: animated, completion: completion)
    

上述方法不起作用,因为 SwiftUI 给出了错误

``[演示]尝试本上 TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentGS1_GS1_GS1_GS1_V16BuyersCircle_ios11ContentViewGVS_30_EnvironmentKeyWritingModifierGSqCS2_11UserService ___ GS4_GSqCS2_11GlobalModal ___ GS4_GSqCS2_9CartModel ___ GS4_GSqCS2_19ReachabilityMonitor ___ GS4_GSqCS2_19PartialSheetManager EM> ___:0x158715600>(距离 P>

所以我在想

如果我能拿到当前的SwiftUI modal view controller,那么我就可以基于它呈现UIKit modal。我不知道如何让它工作。

【问题讨论】:

【参考方案1】:

在您的算法中,您正在计算 rootViewController,但随后将 self 呈现给 UIApplication.shared.rootViewController,而不是找到的 rootViewController

替换

UIApplication.shared.rootViewController?.present(self, animated: animated, completion: completion)

rootViewController?.present(self, animated: animated, completion: completion)

【讨论】:

以上是关于如何检测模态视图在 SwiftUI 中全局可见的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 检测视图何时不可见(有点视图会消失)并停止发布者

如何使用 SwiftUI 在模态视图中创建 NSManagedObject?

如何在 SwiftUI 中制作具有透明背景的模态视图?

SwiftUI - 如何关闭假的模态视图 - 从里面的第二个视图,用关闭按钮?

iOS开发 - 在SwiftUI中显示模态视图

如何在 SwiftUI 中关闭 ResearchKit 模态视图?