iOS和Swift:确定强制展开tableView.indexPath?

问题描述:

我有一个从表视图控制器segue到另一个视图控制器。在方法内部准备(for:sender)我需要获取触发segue的单元格的indexPath。在这种情况下强行拆开索引路径可以吗?当所有的prepare()方法都是通过点击一个表格行触发的,所以我可以假设'sender'包含对有效对象的引用yes?iOS和Swift:确定强制展开tableView.indexPath?

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

如果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 
} 

这似乎是有点过度工程,但我有过在小区按钮和/或允许细胞被选中表格视图直。

所以我创建了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) 
    } 
} 
+0

思考我的问题后,我才发现更深层次的问题我是试图问的是这样的:我可以假定当prepare()被调用时,iOS会给我有效的参数,还是我总是需要防范应该永远不会发生的情况?在上面的代码中,我想知道你会在guard语句else子句中做什么?除了崩溃之外,你会如何处理这样的错误? – ehmjaysee