1

我有一个从表视图控制器到另一个视图控制器的 segue。在方法 prepare(for: sender) 中,我需要获取触发 segue 的单元格的 indexPath。在这种情况下可以强制解开索引路径吗?在所有prepare() 方法都是通过点击表格行触发的,所以看来我可以假设'sender' 包含对有效对象的引用,是吗?

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {   
  if segue.identifier == "TheCorrectSegue" {   
    let indexPath = tableView.indexPath(for: sender as! UITableViewCell)! <-- is this OK?   
}}  
4

2 回答 2

2

如果 segue 连接到表格视图单元格,则它是安全的,因为始终通过sender参数传递有效单元格。

但实际上并没有更多的代码可以写

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {   
    guard segue.identifier == "TheCorrectSegue", let cell = sender as? UITableViewCell, 
      let indexPath = tableView.indexPath(for: cell) else { return } 
      // do something with the index path
}  
于 2017-04-26T20:01:55.607 回答
0

这可能看起来有点过度设计,但我的表格视图在单元格中有按钮和/或允许直接选择单元格。

所以我创建了 UIView 扩展方法来获取表格视图的东西。

extension UIView {

    var superTableViewCell: UITableViewCell? {
        if let cell = self as? UITableViewCell {
            return cell
        }

        return superview?.superTableViewCell
    }

    var superTableView: UITableView? {
        if let tableView = self as? UITableView {
            return tableView
        }

        return superview?.superTableView
    }

    var indexPathOfSuperTableViewCell: IndexPath? {
        if let tableView = superTableView, let cell = superTableViewCell {
            return tableView.indexPath(for: cell)
        }

        return nil
    }

}

这让我减少了获取正确索引路径的问题

private func _segueIndexPath(for view: UIView?) -> IndexPath? {
    if let indexPath = view?.indexPathOfSuperTableViewCell {
        return indexPath
    }

    return tableView.indexPathForSelectedRow
}

最后,

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    switch segue.identifier ?? "" {
    case "TheCorrectSegue":
        guard let indexPath = _segueIndexPath(for: sender as? UIView) else {
            // Handle error
            return
        }

        // prepare for the segue.

    default:
        super.prepare(for: segue, sender: sender)
    }
}
于 2017-04-26T21:20:06.883 回答