如何在Swift中使用UISplitViewController

所以我将一个UISplitViewController添加到一个嵌入了UITabBarController的项目中。

UISplitViewController具有UINavigationController作为与自己的根控制器的Master&Detail关系。

Master UINavigationController rootController具有Detail UINavigationController的细节segue。

看这里:

在此处输入图像描述

一切都很简单吧? 现在在TableViewController中我执行以下操作;

 class TableViewController: TableViewController, UISplitViewControllerDelegate { var collapseDetailViewController: Bool = false override func viewDidLoad() { super.viewDidLoad() splitViewController?.delegate = self } override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { collapseDetailViewController = false } // MARK: - UISplitViewControllerDelegate func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController: UIViewController, ontoPrimaryViewController primaryViewController: UIViewController) -> Bool { return false } 

我也有一个UISplitViewController扩展并执行以下操作;

 extension UISplitViewController: UISplitViewControllerDelegate { public override func viewDidLoad() { self.extendedLayoutIncludesOpaqueBars = true } } 

完成所有这些后,我遇到了以下问题;

  • 当点击tableviewcell以切换到详细视图时,当在iPad上横向而不是右侧时,详细视图将在主左窗格内打开。 我也无法弄清楚如何在iPad或iPhone上使用Portrait时将Master View显示为第一个视图。 这两个问题可能有关,也可能没有关系我不确定。

    在此处输入图像描述

  • 在移动设备上,标签栏上方有一个底栏,我无法弄清楚如何删除。 我在iPad上遇到了同样的问题,直到我在UISplitViewController扩展viewDidLoad添加了代码,但这并没有影响移动设备。 看这里,

在此处输入图像描述

PS:我不确定问题是否太长,我认为最好将所有内容放在上下文中。 此外,我一直在做大量的研究,但我在swift中找不到任何使用UITabBarController的资源。

我确实按照以下教程http://nshipster.com/uisplitviewcontroller/

你是如此接近,只需做以下事情。

保持拆分视图布局与细节segues并为以下方法返回true并删除其余代码以使用变量collapseDetailViewController

 func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController: UIViewController, ontoPrimaryViewController primaryViewController: UIViewController) -> Bool { return true } 

将以下内容放入Master View控制器中

 self.splitViewController!.delegate = self; self.splitViewController!.preferredDisplayMode = UISplitViewControllerDisplayMode.AllVisible self.extendedLayoutIncludesOpaqueBars = true 

self.extendedLayoutIncludesOpaqueBars = true添加到您的详细视图控制器,如上一个答案所述。 这应该删除视图控制器上出现的栏。

此外,如果您想要一些额外的function,如果您希望您的详细视图在iPad上使用全屏,请添加以下内容。

 navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem() navigationItem.leftItemsSupplementBackButton = true 

至于splitViewController的master是可见的,你需要在splitViewController的ViewDidLoad中添加它。 此外,主视图控制器作为侧面菜单出现,您可以在纵向模式下拖动

 self.preferredDisplayMode = UISplitViewControllerDisplayModeAllVisible; 

但是,这个主要细节视图只能在iphone 6 plus和ipad中看到,否则,它就像导航控制器一样。 至于将viewController推送到导航控制器,您正试图将导航控制器推送到另一个导航控制器。 我不认为这是推荐的。 只需将segue从第一个视图控制器(您输入文本的位置)移动到第二个(颜色视图控制器),而不是第二个导航控制器。 如果您有兴趣在ipad和iphone6的右侧部分显示详细信息,并且作为其他设备的新页面,则不应使用此方法,删除push segue并使用委托传递数据已更改的信息并刷新UI。

故事板截图

此外,我不认为你可能需要一个navigationController作为详细信息页面,只是颜色viewController可能就足够了,如果你不想从详细信息页面进一步导航。

有关iphone和iPad中分割视图控制器行为的详细信息,请查看https://www.raywenderlich.com/94443/uisplitviewcontroller-tutorial-getting-started

尝试将self.extendedLayoutIncludesOpaqueBars = true添加到navigationController的viewDidLoad中以获取间隙问题