如何在 Swift 中使用 UISplitViewController
How to use a UISplitViewController in Swift
所以我将 UISplitViewController
添加到一个嵌入了 UITabBarController
的项目中。
UISplitViewController
与他们自己的根控制器有一个 UINavigationController
作为主从关系。
大师 UINavigationController
rootController
有一个细节转至细节 UINavigationController
。
看这里:
一切都很简单吧?现在在 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 上以纵向显示主视图作为第一个视图。我不确定这两个问题是否相关。
在移动设备上,标签栏上方有一个底部栏,我不知道如何删除它。我在 iPad 上遇到了同样的问题,直到我在 UISplitViewController
扩展 viewDidLoad
中添加了代码,但这并不影响移动设备。看这里,
PS:不知道是不是问题太长了,我觉得最好结合上下文。我也做了很多研究,但我在 swift 中找不到任何使用 UITabBarController 的资源。
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 以解决间隙问题
您非常接近,只需执行以下操作。
保持拆分视图布局与细节 segues 和 return 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
添加到您的详细视图控制器,如上一个答案所述。那应该删除出现在您的视图控制器上的栏。
此外,如果您希望在 iPad 上使用全屏详细视图,则需要一些额外的功能,请添加以下内容。
navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem()
navigationItem.leftItemsSupplementBackButton = true
所以我将 UISplitViewController
添加到一个嵌入了 UITabBarController
的项目中。
UISplitViewController
与他们自己的根控制器有一个 UINavigationController
作为主从关系。
大师 UINavigationController
rootController
有一个细节转至细节 UINavigationController
。
看这里:
一切都很简单吧?现在在 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 上以纵向显示主视图作为第一个视图。我不确定这两个问题是否相关。在移动设备上,标签栏上方有一个底部栏,我不知道如何删除它。我在 iPad 上遇到了同样的问题,直到我在
UISplitViewController
扩展viewDidLoad
中添加了代码,但这并不影响移动设备。看这里,
PS:不知道是不是问题太长了,我觉得最好结合上下文。我也做了很多研究,但我在 swift 中找不到任何使用 UITabBarController 的资源。
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 以解决间隙问题
您非常接近,只需执行以下操作。
保持拆分视图布局与细节 segues 和 return 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
添加到您的详细视图控制器,如上一个答案所述。那应该删除出现在您的视图控制器上的栏。
此外,如果您希望在 iPad 上使用全屏详细视图,则需要一些额外的功能,请添加以下内容。
navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem()
navigationItem.leftItemsSupplementBackButton = true