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

Posted

技术标签:

【中文标题】在横向模式下转到细节视图控制器【英文标题】:Segue to detail view controller on landscape mode 【发布时间】:2016-12-22 12:37:21 【问题描述】:

我正在使用 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
        
    


这是我的故事板:

这是正常行为:

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

【问题讨论】:

主视图应该是一个表格,可以滑动到另一个表格视图(在同一框架中),然后从那里转到详细视图? 它不会在主视图中滑动到另一个表,它只是在用户在搜索栏中键入时重新加载不同的数据。 我的意思是你在master中显示点击,详细进入子菜单然后点击进入详细页面。应该是在母版中点击,在母版中滑动到子菜单,点击查看详细信息。 嗯,它的默认行为就像你提到的那样,就像第一个演示一样,但第二个有点不同;当用户点击母版中的一行时,它应该 [我想要的] 在详细视图中显示数据。 确保箭头所指的segue是“Show Detail (eg Replace)”。 【参考方案1】:

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

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

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

从 Xcode 创建一个默认的 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()

另外,细节部分应该“显示细节”

【讨论】:

我的问题显然是关于将数据推送到 detailViewController,而不是实现搜索控制器。 我正在寻找的是将搜索控制器保持在主视图中并将数据推送到详细视图。 是的,它将视图加载到错误的位置。我不能从主视图对不同的视图控制器进行多个 segue 吗? 让我们continue this discussion in chat。

以上是关于在横向模式下转到细节视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

UISplitViewController 在横向模式下出现纵向

如何始终将视图控制器保持在纵向模式?

在 Objective-C 中的 iOS 6 上强制横向方向

以纵向模式单独显示主视图

视图控制器处于横向模式,但我从纵向模式获取框架?

如何在横向模式下打开视图控制器?