在横向模式下转到详细视图控制器
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 应该“显示详细信息”
我正在使用 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 应该“显示详细信息”