我有一些独特的 UISplitViewController
设置(我认为)。我的主视图 Controller 是导航 Controller 内的 TableView Controller ,这是正常的。但是,我的详细 View Controller 是 UITabBarController
。每个选项卡都有一个导航 Controller 来包装内容。
当用户在主视图 Controller 中选择表格行时,我在详细 View Controller 中选择一个选项卡并开始推送 View Controller :
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 上效果很好。在主视图 Controller 表中选择一个项目会选择详细 View Controller 中的选项卡并将 View Controller 推送到它。
在 iPhone 上,我使用 this post 在初始加载时显示主视图 Controller :
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
}
}
但是,在主视图 Controller 表中选择一行实际上没有任何作用。当主表中的一行被选中时,如何让细节 View Controller 显示?
最佳答案
首先,为什么您需要这两个功能:Master-Detail
和 Tab
。因为如果您使用选项卡实现主详细信息,那么您必须在 Master
中具有相同数量的选项卡和相同的行数,然后只有您可以在选择行时导航到选项卡。在 iPhone 中最多只有 5 个选项卡,如果您在 Master
中有 7 行,那么如果用户单击第 6 行和第 7 行会发生什么?
因为按照设计理念:你应该只根据要求选择一个。
Master-Detail
-> 提供侧边菜单等功能,因此用户可以从中访问更多选项。TabBar
-> 底部有菜单,提供更多选项。
无论如何,您可能有一些独特的要求。
正如您在 iPad 上所说,它工作正常。因此,对于 iPhone,您可以采用以下方式:
- Storyboard中的 UI 应该是这样的:
- 在您的项目中创建或添加
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 } }
但请确保您有足够数量的选项卡与行数相同。
关于ios - 在 UISplitViewController 中,如何让 master 打开 iPhone 的详细 View Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56308466/