在景观模式上观看详细视图控制器

时间:2016-12-22 12:37:21

标签: swift segue uisplitviewcontroller

我使用 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
        }
    }

}

这是我的故事板: enter image description here

以下是正常行为: enter image description here

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

1 个答案:

答案 0 :(得分:2)

导航控制器太多,segue太多。

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

您可能不需要(也不应该)"showDetail""showSearchDetail":搜索只是缩小了主视图中可用内容的范围,这是预期的用户体验。
关于该主题的优秀资源是来自raywenderlich.com的Candy Search,其中有一个很好的示例和教程。

从Xcode创建默认的Master-Detail项目产生了这种结构:

5 views master-detail

要为其添加UISearchController,请在主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应“显示详细信息”

Proper segue