iOS 从任何地方将 UIViewController 显示为弹出窗口

Posted

技术标签:

【中文标题】iOS 从任何地方将 UIViewController 显示为弹出窗口【英文标题】:iOS Show UIViewController as Popup from Anywhere 【发布时间】:2017-11-28 19:45:22 【问题描述】:

基本问题:

是否有可靠的方法在应用生命周期的任何时候(包括从不同的线程)触发显示模态 UIViewControllers

我目前的方法是在显示的 ViewController 上调用 presentViewController(通过 window.rootViewController + 层次遍历找到,但这并不重要)。这通常有效,但有时会因为发生导航动作/动画等原因而被忽略。

例如一个后台线程表示要显示一个弹出窗口,并且在被解雇的过程中,presentViewControllerViewController 上被调用。

我尝试了一些变通方法,例如在未显示 ViewController 时重复信号(这导致某些情况下它被多次显示),但它最终成为了一个 whackamole 游戏。

理想的解决方案还允许在弹出窗口下方进行导航,但目前的主要问题只是可靠性。

编辑

需要说明的是,我是一位经验丰富的开发人员。线程处理得当,实例和类型管理工作正常。我的问题是试图管理所有 极端情况,而不是如何做到这一点的基础知识。

【问题讨论】:

首先,任何 UI 更改都需要在 UI 线程上完成,因此不能选择不同的线程。其次,我猜你想在任何时候都显示这个,不管发生什么,所以你为什么不简单地将它添加到所有内容之上的窗口并手动处理显示/隐藏? 线程处理得当,不是问题。我曾一度尝试直接使用窗口,但遇到了覆盖它的其他问题。也许应该再试一次。 你需要的是让这个类成为一个单例。这样,只会加载视图的一个实例。并且显示/隐藏不会相互重叠。 和@Lefteris 评论 +1 - UI 相关更新必须在主线程上完成。 @GeneCode。见编辑。不幸的是,这不是我的问题(并且已经在使用单例)。 【参考方案1】:

如果您需要在多线程环境中显示不同 VC 的线程安全机制,您可以创建一些负责呈现/关闭控制器的对象。并在介绍/解雇时排队。因此,当您的信号发生时,您的呈现操作将在关闭队列中的当前 VC 后进行下一步

【讨论】:

以上是关于iOS 从任何地方将 UIViewController 显示为弹出窗口的主要内容,如果未能解决你的问题,请参考以下文章

如何有条件地从单个 UITabBar 项目中选择 UIViewController 并保持 TabBar 可见

从实体到 DTO 的转换

IOS。在 UIToolbar 子类中调用导航控制器方法

UISplitViewController 从任何地方平移到主视图

iOS:从任何地方返回根视图控制器

将自定义 UITableViewCell 从 nib 加载到 Swift 中的 UIViewController