【问题标题】:How can I make one Tab Bar button refer to two views/controllers in iOS如何让一个 Tab Bar 按钮引用 iOS 中的两个视图/控制器
【发布时间】:2012-02-13 21:36:50
【问题描述】:

我现在正在开发一个带有标签栏导航的 iOS 应用程序。

我有两个屏幕显示相同的信息,但格式不同(例如,列表和网格)。

这两个屏幕完全不同,需要单独的控制器。

用户可以通过顶部的共享控制栏按钮 (toggle) 在两个视图之间切换。

场景:

用户第一次按下“地点”按钮,它将地点显示为列表。 他们按“网格”以查看显示为网格的相同地点。
用户按下另一个标签栏按钮以导航到不同的屏幕。 当他们再次按下“地点”按钮时,应用程序会记住他们上次查看的地点屏幕是网格,因此会显示网格视图。 然后用户可以切换回列表视图。等等……

任何人都可以推荐实现这一目标的最佳方法吗?

【问题讨论】:

    标签: ios ios5 xcode4.2


    【解决方案1】:

    一种方法是使用一个视图控制器来管理两个视图。这样,您就不必费心同步数据或破坏 UITabBarController 的正常功能——只有一个控制器。此外,不要试图重载该控制器选项卡的含义。相反,向两个视图添加一个按钮,告诉控制器切换到另一个视图。这对您来说更容易构建,并且(更重要的是)更容易让用户理解。让熟悉的控件做不熟悉的把戏可不好。

    如果您的视图控制器使得将它们组合成一个会很复杂,那么您可以使用两个控制器并通过修改标签栏控制器的viewControllers 数组来简单地将它们换入和换出标签栏。您仍然可以通过让两个控制器引用相同的数据模型来避免在它们之间同步数据。

    【讨论】:

    • 我这样说对吗,如果这些视图中只有一个是表视图,那么控制器类不应该从UITableViewController 继承吗?在这种情况下,最好添加一个协议?
    • 这是否破坏了 iOS 的最佳实践(让一个控制器控制两个视图层次结构)?
    • @bodacious 在考虑了更多之后,我更新了我的答案。如果两个视图如此不同以至于它们与视图控制器的交互方式不同,那么你可能是对的,拥有单独的控制器是有意义的。不过,我仍然会避免使用选项卡在两个控制器之间切换——这只会让用户感到困惑。
    【解决方案2】:

    我试图实现同样的目标,实际上可以通过 TabBarController、NavigationControllers、ViewControllers、push segues 和 unwinds 的基本设置来完成。

    标签栏控制器 |==> NavigationController --> PlacesController(网格视图) --(从导航栏推segue)--> PlacesController(列表视图) |==> 导航控制器 --> 其他控制器 |...

    确保从列表视图控制器返回到网格视图控制器的 unwind segue。

    如果您在视图之间切换然后转到另一个选项卡(例如 otherController)并返回,您将返回到您看到的最后一个视图,因为那是 NavigationController 堆栈顶部的内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 2020-02-07
      • 1970-01-01
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多