在横向模式下转到详细视图控制器

Segue to detail view controller on landscape mode

我正在使用 UISPlitViewController 以便在屏幕上显示分类数据。我在主视图控制器上实现了一个搜索方法,数据流在 iPhone 屏幕上很好,但在 iPad、纵向和横向上,它确实按我想要的方式工作。

我已经创建了一个 segue(黑色箭头指向它)来详细说明控制器,但它会将数据加载到主视图控制器中。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showDetail" {
        if let indexPath = self.tableView.indexPathForSelectedRow {
            let object = categoryID[indexPath.row]
            let controller = (segue.destination as! UINavigationController).topViewController as! DetailTableViewController
            controller.detailItem = object as Int?
            controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem
            controller.navigationItem.leftItemsSupplementBackButton = true
        }
    //this is the problem!
    }else if segue.identifier == "showSearchDetail" {
        if let indexPath = self.tableView.indexPathForSelectedRow {
            let object = searchResultDrugsID[indexPath.row]
            let controller = (segue.destination as! UINavigationController).topViewController as! DrugDetailsTableViewController
            controller.detailItem = object as Int?
            controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem
            controller.navigationItem.leftItemsSupplementBackButton = true
        }
    }

}

这是我的故事板:

这是正常行为:

这就是问题所在,我想在用户点击搜索结果时在详细视图控制器中加载数据:

导航控制器太多,转场太多。

根据故事板屏幕截图,我只能假设您可能没有正确混合和匹配 detail 视图控制器。具体来说,带黑色箭头的那个不应该在那里。

您可能不需要(也不应该)同时使用 "showDetail""showSearchDetail":搜索只是缩小主视图中可用内容的范围,这是预期的用户体验。
raywenderlich.com 中的 Candy Search 是关于该主题的优秀资源,其中包含出色的示例和教程。

从 Xcode 创建一个默认的 Master-Detail 项目会产生这个结构:

要向其添加 UISearchController,请在您的 master UITableViewController:

中以编程方式构建它
let searchController = UISearchController(searchResultsController: nil)

searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
tableView.tableHeaderView = searchController.searchBar
definesPresentationContext = true

并过滤来自 UISearchResultsUpdating 委托的结果:

extension MasterViewController: UISearchResultsUpdating {
  func updateSearchResults(for searchController: UISearchController) {
    filter(searchController.searchBar.text!)
  }
}

func filter(_ searchText: String) {
  // Your filter goes here
  tableView.reloadData()
}

此外,详细信息 segues 应该“显示详细信息”