【问题标题】:Presenting a modal from a UITabBarController从 UITabBarController 呈现模式
【发布时间】:2014-09-25 19:33:12
【问题描述】:

与 Instagram 和其他流行应用程序类似,我希望我的 UITabBarController 中的一个按钮将其视图控制器呈现为全屏模式而不是普通选项卡。我使用 Storyboards 将 UITabBarController 连接到它的所有子视图控制器,但我不知道如何将一个视图控制器呈现为模式。我在这里发现了一些其他问题,询问同样的事情,但他们似乎是手动组装标签栏,而不是像我一样使用 segues。这甚至可能是我这样做的方式吗?

【问题讨论】:

    标签: ios xcode cocoa-touch uitabbarcontroller uistoryboard


    【解决方案1】:

    tldr - 查看下面的代码。

    我从 axxixc 的方法开始,但遇到了一些问题。我试图通过实现UITabBarControllerDelegatetabBarController:shouldSelectViewController: 以模态方式显示视图。然而,iOS 抱怨视图已经在视图层次结构中,一旦你想到它就很明显,因为在 IB 中使用 UITabBarController 的全部目的是让 iOS 为我们处理实例化这些视图。所以接下来我从它的父视图中删除了视图,这阻止了错误,但这种方法仍然感觉错误和脆弱。它也没有让我控制每次模型弹出时是否要重新实例化视图,在我的例子中我做到了。

    所以我最终做的是,在 IB 中,将该特定选项卡连接到一个空视图控制器,该控制器将有效地充当占位符。我重写了相同的tabBarController:shouldSelectViewController: 方法并检查视图控制器的标题。如果它与我在 IB 中设置的虚拟标题匹配,我会在显示我自己的视图后通过返回 false 来停止标签栏控制器显示虚拟控制器。

    代码如下:

    func tabBarController(tabBarController: UITabBarController!, shouldSelectViewController viewController: UIViewController!) -> Bool {
        if viewController.title? == DUMMY_POST_VIEW_CONTROLLER_TITLE {
            let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let actualController = storyboard.instantiateViewControllerWithIdentifier("ActualViewController") as ActualViewController
            presentViewController(actualController, animated: true, completion: nil)
            return false
        }
    
        return true
    }
    

    【讨论】:

    • 不知何故,这在 iOS8 中不能很好地用于旋转,因为即使视图以模态方式呈现,当设备旋转时仍会调用底层的 UITabBarController。
    【解决方案2】:

    我非常怀疑 Instagram 正在使用完全自定义的标签栏,但如果您想使用标准 UIKit 来执行此操作,我会说一个很好的查看位置是子类化 UITabBarController 并覆盖其中的一些 @ 987654322@ 方法,特别是-[UITabBarDelegate tabBar:didSelectItem:]

    【讨论】:

      猜你喜欢
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-10
      相关资源
      最近更新 更多