【问题标题】:Switching between competing modal view controllers在竞争的模态视图控制器之间切换
【发布时间】:2012-02-18 04:51:02
【问题描述】:

我的应用有三种状态:

  • A) 连接到服务器
  • B) 连接到 wifi,但没有互联网
  • C) 没有连接

第一个状态是应用程序的默认操作模式,另外两个(B & C)以模态视图控制器的形式呈现。在各种可达性更改时,应该会出现正确的模态视图。

不幸的是,在某些情况下,B 和 C 都尝试同时显示,或者 B 当前已显示并且可能距离关闭还有一毫秒,但 C 已经在尝试显示自己。

我的解决方案是基本上为每个模态视图创建一个带有一些代表的信号量 - 当一个模态视图打开时,它会通过代表发送消息以转到主视图以打开标志。然后当第二个模态视图试图打开时,它会看到第一个打开并等待它关闭。对于我试图制作一个非常基本的状态机来说,这似乎是一个荒谬的 hack。

有什么想法吗?

【问题讨论】:

    标签: iphone ios modalviewcontroller


    【解决方案1】:

    您没有指定在哪种情况下 B 和 C 可以同时出现,所以首先想到的是您可以寻找一种不同的方法来检查您是在情况 B 还是 C 中,这样您就可以更好地消除歧义。

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

    【讨论】:

    • 不幸的是,基于我的可达性机制的输出,B & C 案例似乎重叠(或者更准确地说,构成 B 和 C 重叠的一些条件)。重新通知,我的应用程序已经为其他目的做了很多这样的事情,我希望尽可能地保持网络状态和相关的 UI 内容。
    【解决方案2】:

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

    【讨论】:

    • 这似乎是最简单的解决方案 - 没有通知,没有委托,因此代码将尽可能可维护。
    猜你喜欢
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多