2017-04-26 64 views
1

我有一個從表視圖控制器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? 
}} 

回答

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 
} 
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) 
    } 
} 
+0

思考我的問題後,我才發現更深層次的問題我是試圖問的是這樣的:我可以假定當prepare()被調用時,iOS會給我有效的參數,還是我總是需要防範應該永遠不會發生的情況?在上面的代碼中,我想知道你會在guard語句else子句中做什麼?除了崩潰之外,你會如何處理這樣的錯誤? – ehmjaysee