我有一个独特的UISplitViewController
设置(我认为)。我的主视图控制器是导航控制器中的一个表视图控制器,这很正常。但是,我的详细信息视图控制器是UITabBarController
。每个标签都有一个导航控制器,用于将内容包装在其中。
当用户在主视图控制器中选择一个表格行时,我在详细视图控制器中选择一个选项卡并开始推送视图控制器:
let detailViewController = masterViewController?.splitViewController
.viewControllers[1] as? UITabBarController
let selectIndex = 2
let viewController = (detailViewController.viewControllers?[selectIndex] as? UINavigationController)?.viewControllers.first
detailViewController.selectIndex = selectIndex
viewController.show(myCustomViewController)
这在iPad上效果很好。在主视图控制器表中选择一个项目会在详细视图控制器中选择选项卡,并将视图控制器推入该选项卡。
在iPhone上,我使用this post在初始加载时显示了主视图控制器:
class MasterViewController: UIViewController {
private var collapseDetailViewController = true
override func viewDidLoad() {
super.viewDidLoad()
splitViewController?.delegate = self
}
// ...
}
extension MasterViewController: UISplitViewControllerDelegate {
func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool {
return collapseDetailViewController
}
}
extension MasterViewController {
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
collapseDetailViewController = false
selectTabAndPush(index: 2, vc: myCustomViewController)
// Tried swapping the order of these but still no luck
}
}
但是,在主视图控制器表中选择一行实际上不起作用。当选择主表中的一行时,如何显示详细视图控制器?
答案 0 :(得分:1)
首先,为什么需要两个功能:Master-Detail
和Tab
。因为如果要使用制表符实现母版详细信息,那么在Master
中必须具有相同数量的制表符和相同数量的行,因此选择行时只有您可以导航到该制表符。在iPhone中,最多只能有5个标签,如果Master
中有7行,那么如果用户单击第6行和第7行会发生什么情况?
因为按照设计概念:您只能根据要求选择一个。
Master-Detail
->提供侧菜单之类的功能,因此用户可以从中访问更多选项。TabBar
->提供更多选项,底部有菜单。无论如何,您可能有一些独特的要求。
就像您在iPad上所说的那样,它工作正常。因此,对于iPhone,您可以采用以下方式:
UITabBarController
。 (我创建了名为CustomTabController
的tabbarcontroller)。然后在didSelectRowAt
中,按下tabbarcontroller:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.phone {
let tabController = self.storyboard?.instantiateViewController(withIdentifier: "CustomTabController") as! CustomTabController
self.navigationController?.pushViewController(tabController, animated: true)
tab.selectedIndex = indexPath.row
}
else {
// iPad code here
}
}
但是请确保您具有与行数相同的选项卡数。