iOS 和 Swift:可以强制解开 tableView.indexPath?

Posted

技术标签:

【中文标题】iOS 和 Swift:可以强制解开 tableView.indexPath?【英文标题】:iOS and Swift: Ok to force unwrap tableView.indexPath? 【发布时间】:2017-04-26 19:54:56 【问题描述】:

我有一个从表视图控制器到另一个视图控制器的 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?   
  

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

在考虑了我的问题后,我意识到我想问的更深层次的问题是:我可以假设 ios 会在调用 prepare() 时给我有效的参数,还是我总是需要防范这种情况那不应该真的发生吗?在您上面的代码中,我想知道您将在保护语句 else 子句中做什么?除了崩溃,你会如何处理这样的错误?

以上是关于iOS 和 Swift:可以强制解开 tableView.indexPath?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 4 中安全地解开字典值?

无法强制解开非可选类型“UIImage”的值

在 iOS 中使用 Swift 保存 PDF 文件并显示它们

在 Swift 中从 AppDelegate 解开 UIWindow 两次

为啥我不能强制解开我的 $string 以用作 TextField 值?

无法在 View Controller iOS Swift 中显示 TabBar