2017-04-26 8 views
1

테이블 뷰 컨트롤러에서 다른 뷰 컨트롤러로 세그가 있습니다. 메소드 준비 (보낸 사람 : for)에서 segue를 트리거 한 셀의 indexPath를 가져와야합니다. 이 경우 색인 경로의 사용을 강제 해제하는 것이 좋습니까? 모든 prepare() 메소드가 테이블 행을 두드려서 트리거되었으므로 '발신자'에 유효한 객체에 대한 참조가 포함되어 있다는 가정을 할 수 있습니다. 그렇습니까?iOS 및 Swift : unwrap 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

을 올바른 인덱스 경로를지고의 문제를 줄일 수 iOS가 prepare()가 호출 될 때 iOS가 유효한 매개 변수를 제공한다고 가정 할 수 있습니까? 아니면 실제로 일어나지 않아야 할 상황을 항상 감시해야합니까? 위의 코드에서 guard 문에서 else 절을 ​​어떻게 처리하는지 궁금합니다. 충돌과 같은 오류를 어떻게 다룰 수 있습니까? – ehmjaysee