10

我发现了使用 3D Touch 的非常简单的方法——在故事板中选中“Peek & Pop”。但我正在努力解决一个问题。

我有 UITableView,当用户触摸单元格时,我的代码一切正常:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "showDetail" {
        print(tableView.indexPathForSelectedRow)
    }
}

所以我根据选定的行在我的详细控制器中填充数据。但是当我按下 Peek 或 Pop 方法时tableView.indexPathForSelectedRow总是返回 nil (嗯..我没有选择行,我只是预览所以nil我猜是 indexPath)。如何让“偷看”的单元格 indexPath 将其传递给 segue?

或者情节提要的 Peek & Pop 不能以这种简单的方式工作,我需要在我的代码中完全实现 peek & pop?

4

1 回答 1

22

可以使用情节提要和prepareForSegue. 您可以通过使用sender对象来做到这一点。

假设您已经直接从情节提要中的表格单元格创建了 segue 到下一个视图控制器,那么 sender 对象的类型将是UITableViewCell. 如果您以编程方式触发 segue,则只需记住sender在方法调用中设置对象。

您可以使用此单元格从 中获取NSIndexPathtableView类似于以下内容(忽略所有强制展开,这仅用于演示目的):

override func prepare(for segue: UIStoryboardSegue, sender: AnyObject?) {
    let cell = sender as! UITableViewCell
    let indexPath = tableView.indexPath(for: cell)!
    if segue.identifier == "mySegue" {
        let destination = segue.destination as! DetailsViewController
        destination.model = self.model[indexPath.row]
    }
}
于 2016-03-08T14:15:31.350 回答