如何在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中以获取间隙问题