主从应用程序中的UITableViewCell的Peek&Pop

时间:2018-10-09 18:23:28

标签: ios swift uikit

我有一个来自RayWenderlich的示例应用程序:UISearchController Tutorial: Getting Started-请获取finished version

在这个项目中,我们在表格视图中有一个糖果列表,如果点击一行,我们将获得该糖果的详细信息视图。为了使细节视图正常工作,我们使用选定的糖果设置了DetailViewController的{​​{1}}属性。

我只是想增加偷看和弹出功能。我尝试了一种简单的方法:只需在情节提要中启用 Preview&Commit Segues ,然后等待它开始工作即可。它确实以适当的顺序调用了detailCandy方法,但不幸的是,我似乎无法根据prepare(for:sender:)本身来确定selectedCandy

  1. tableView的{​​{1}}是tableView
  2. 可以通过使用以下属性来使用私有API(快速修复)解决此问题:indexPathForSelectedRow
  3. 我知道我可以借助nil从代码中手动实现peek&pop,而我的问题就消失了。

有人知道如何轻松,优雅地解决此问题吗?

1 个答案:

答案 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
  }
 }
}

它检查是否已选择该单元格或用户是否正在窥视,并相应地进行调整。