我有一个来自RayWenderlich的示例应用程序:UISearchController Tutorial: Getting Started-请获取finished version
在这个项目中,我们在表格视图中有一个糖果列表,如果点击一行,我们将获得该糖果的详细信息视图。为了使细节视图正常工作,我们使用选定的糖果设置了DetailViewController
的{{1}}属性。
我只是想增加偷看和弹出功能。我尝试了一种简单的方法:只需在情节提要中启用 Preview&Commit Segues ,然后等待它开始工作即可。它确实以适当的顺序调用了detailCandy
方法,但不幸的是,我似乎无法根据prepare(for:sender:)
本身来确定selectedCandy
。
tableView
的{{1}}是tableView
。indexPathForSelectedRow
nil
从代码中手动实现peek&pop,而我的问题就消失了。有人知道如何轻松,优雅地解决此问题吗?
答案 0 :(得分:1)
在tableView.indexPath(for: sender as! UITableViewCell)
中使用prepare(for:sender:)
即可完成工作。
这是我的prepare(for:sender:)
的样子:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showDetail" {
var indexPath = tableView.indexPathForSelectedRow
if indexPath == nil {
indexPath = tableView.indexPath(for: sender as! UITableViewCell)
}
if let indexPath = indexPath {
let candy: Candy
if isFiltering() {
candy = filteredCandies[indexPath.row]
} else {
candy = candies[indexPath.row]
}
let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController
controller.detailCandy = candy
controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem
controller.navigationItem.leftItemsSupplementBackButton = true
}
}
}
它检查是否已选择该单元格或用户是否正在窥视,并相应地进行调整。