UITAbBarController作为UISplitController和showDetail中的主对象:

问题描述 投票:1回答:2

我在这种情况下有一个故事板;

My Storyboard

根视图控制器是具有以下内容的UISplitViewController:

  • MASTER:UITabBarController
    • 0-> UINavigationController-> ...其他ViewControllers
    • 1-> UINavigationController-> ...其他ViewControllers
  • 详细信息:UINavigationController-> DetailViewControler

在此层次结构中,从主视图中的最后一个视图控制器到详细导航控制器的segue showDetail不起作用,因为在折叠的环境中以模态方式显示了Detail,而不是通过推送来呈现。我认为此行为来自选项卡栏控制器,因为它不是UINavigationController之类的容器。实际上,如果我删除选项卡栏并将导航设置为“拆分视图控制器的主控件”,则它的工作原理与往常一样。

在折叠的环境中,如何使用选项卡栏(如Split View Controller的主人)并获得showDetail segue的正确行为?

P.S .:对于正确的行为,我的意思是在水平紧凑的环境(iPhone 6加纵向)中按下主导航控制器中的“细节”。

ios swift storyboard uitabbarcontroller uisplitviewcontroller
2个回答
0
投票

我解决了这个问题,重写了UISplitViewControllerDelegate的这些方法,并在其中实现了我希望从SplitViewController获得的所有行为:

  • primaryViewControllerForCollapsingSplitViewController
  • splitViewController:collapseSecondaryViewController:ontoPrimaryViewController
  • primaryViewControllerForExpandingSplitViewController
  • splitViewController:separateSecondaryViewControllerFromPrimaryViewController:

我建议您看一下UISplitViewController文档,因为它很好地解释了分割控制器的行为:

UISplitViewController Documentation

您可以在这里找到所需的内容:

拆分视图控制器在其尺寸级别在水平规则和水平紧凑之间切换时执行折叠和展开过渡。在这些过渡期间,拆分视图控制器将更改其子视图控制器的显示方式。当从水平规则更改为水平紧凑时,拆分视图控制器会将一个视图控制器折叠到另一个视图控制器上。从水平压缩变回水平常规时,它会再次扩展界面并根据显示模式显示其子视图控制器中的一个或两个。过渡到折叠接口时,拆分视图控制器与其委托一起工作以管理过渡。在合拢转换结束时,拆分视图控制器通常仅显示其主视图控制器中的内容。您可以通过在拆分视图控制器委托中实现primaryViewControllerForCollapsingSplitViewController:方法来更改此行为。您可能使用该方法来指定辅助视图控制器或完全不同的视图控制器,也许是一种更适合在水平紧凑环境中显示的视图控制器。如果要对视图控制器和视图层次结构进行任何其他调整,则还可以在委托中实现splitViewController:collapseSecondaryViewController:ontoPrimaryViewController:方法。扩展过程通过要求委托人指定哪个视图控制器成为主视图控制器,并为委托人提供执行自身转换的机会,从而扭转了折叠过程。如果实现用于折叠拆分视图界面的委托方法,则还应该实现primaryViewControllerForExpandingSplitViewController:和splitViewController:separateSecondaryViewControllerFromPrimaryViewController:用于扩展该界面的方法。如果您未实现任何方法,则拆分视图控制器将提供默认行为以处理折叠和展开过渡。有关用于管理折叠和展开过渡的方法的更多信息,请参见UISplitViewControllerDelegate协议参考。

希望这可以帮助您。

PS:对不起,英语不好。


0
投票

showDetail期间,分割视图控制器检查是否折叠并在主节点上调用showViewController,在这种情况下,该选项卡是不实现此方法的选项卡控制器,因此依赖于默认的视图控制器方法进行搜索可以找到的层次在这种情况下,在[拆分视图控制器]上调用了showViewController,该控制器通过首先检查是否折叠来实现它,然后调用presentViewController,这就是为什么您看到它以模态形式显示的原因。

为解决这个问题,您可以继承Tab控制器的子类,实现showViewController并在选定的视图控制器(将是当前的导航控制器)上调用它。

您还需要处理折叠和分离,一种方法是在选项卡子类中实现separateSecondaryViewControllerForSplitViewController并将其转发到包含详细信息nav控制器的nav控制器子级,因为这是取消隐藏其导航栏的原因并将其弹出堆栈。如果实现拆分控制器的单独的Secondary委托方法,您将不会得到该行为

© www.soinside.com 2019 - 2024. All rights reserved.