ios - 在 UISplitViewController 中,如何让 master 打开 iPhone 的详细 View Controller ?

标签 ios swift uisplitviewcontroller

我有一些独特的 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-DetailTab。因为如果您使用选项卡实现主详细信息,那么您必须在 Master 中具有相同数量的选项卡和相同的行数,然后只有您可以在选择行时导航到选项卡。在 iPhone 中最多只有 5 个选项卡,如果您在 Master 中有 7 行,那么如果用户单击第 6 行和第 7 行会发生什么?

因为按照设计理念:你应该只根据要求选择一个。

  1. Master-Detail -> 提供侧边菜单等功能,因此用户可以从中访问更多选项。
  2. TabBar -> 底部有菜单,提供更多选项。

无论如何,您可能有一些独特的要求。

正如您在 iPad 上所说,它工作正常。因此,对于 iPhone,您可以采用以下方式:

  1. Storyboard中的 UI 应该是这样的: TabBar as DetailView
  2. 在您的项目中创建或添加 UITabBarController。 (我创建了名为 CustomTabController 的 tabbarcontroller)。
  3. 然后在 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/

相关文章:

ios - 我如何获得子字符串?

xcode - 如何让应用程序购买工作

objective-c - 如何通过多个详细 View Controller 保留indexPath值?

ios - 对应真实的iDevice和iOS模拟器

ios - 在运行时检测 Swift 中是生产代码还是测试代码

javascript - 如何在 Phonegap 应用程序中查找内存泄漏

ios - 如何访问和保存 Collection View 中各个单元格的数据?

ios - 使用 RxSwift 阻塞线程

iOS 11 - 当 DisplayMode.primaryHidden 更改为 .allVisible 时,SplitViewController 主导航 TableView 更改状态栏颜色

ios - UITabBarController 中的 UISplitViewController 中的黑条