Iphone 在竞争模式视图控制器之间切换

Iphone 在竞争模式视图控制器之间切换,iphone,ios,modalviewcontroller,Iphone,Ios,Modalviewcontroller,我的应用程序有三种状态: A) 已连接到服务器 B) 已连接到wifi,但没有互联网 C) 没有联系 第一种状态是应用程序的默认操作模式,另外两种状态(B&C)显示为模态视图控制器。在各种可达性变化时,应出现正确的模态视图 不幸的是,在某些情况下,B&C都试图同时呈现,或者B当前呈现,可能距离结束还有一毫秒,但C已经在尝试展示自己 我的解决方案是基本上为每个模式视图创建一个带有一些委托的信号量——当模式视图打开时,它会通过委托发送一条消息到主视图打开一个标志。然后,当第二个模态视图尝试打开时

我的应用程序有三种状态:

  • A) 已连接到服务器
  • B) 已连接到wifi,但没有互联网
  • C) 没有联系
第一种状态是应用程序的默认操作模式,另外两种状态(B&C)显示为模态视图控制器。在各种可达性变化时,应出现正确的模态视图

不幸的是,在某些情况下,B&C都试图同时呈现,或者B当前呈现,可能距离结束还有一毫秒,但C已经在尝试展示自己

我的解决方案是基本上为每个模式视图创建一个带有一些委托的信号量——当模式视图打开时,它会通过委托发送一条消息到主视图打开一个标志。然后,当第二个模态视图尝试打开时,它会看到第一个模态视图处于打开状态,并等待它关闭。对我来说,试图创建一个非常基本的状态机似乎是一个荒谬的黑客行为


有什么想法吗?

您没有指定B&C在哪些情况下可以同时出现,因此首先想到的是,您可以寻找一种不同的方法来检查您是在案例B还是在案例C中,以便更好地消除歧义


说到你使用的国旗,我想丑陋的部分与你提到的等待有关。这对我来说似乎太过分了。一种替代方法是,不让第二个模式视图等待标志重置,而是让第一个模式视图发送第二个视图正在观察的通知。实现这一点非常简单,您可以在S.O.中找到许多示例(例如,)。

我会将单独的B&C案例折叠为一个视图控制器,该控制器会根据B或C是否在任何给定时刻发生而更改其视图。这样你就不会让它们竞争,因为只有一个视图控制器。

不幸的是,基于我的可达性机制的输出,B&C案例似乎重叠了(或者更恰当地说,一些构成B&C重叠的条件)。关于通知,我的应用程序已经为其他目的做了大量的这项工作,我希望尽可能清楚地了解网络状态和相关的UI内容。这似乎是最简单的解决方案-没有通知,没有委托,因此代码将尽可能可维护。