[iOS] TableView에서 상세 뷰로 이동하기 위해 indexPath를 획득하는 방법

Ryan (Geonhee) Son·2021년 5월 2일
0

Study Stack

목록 보기
15/34

부제: prepare(for:sender:)sender는 무엇일까?

TableView에서 Cell을 선택하면 상세 페이지로 이동하게끔 구성해야 하는 경우가 있습니다. 그럼 선택된 Cell이 무엇인지 알기 위해 indexPath.row 값을 찾아야 하는데요, 이번에는 해당 상황에서 어떻게 indexPath를 얻을 수 있는지 알아보겠습니다.

이전 포스팅에서 다음 화면으로 정보를 넘겨주는데 UIViewControllerprepare(for:sender:) 메서드를 사용할 수 있다는 것을 알아봤습니다. 동일하게 해당 메서드를 활용해볼게요.


1. tableView.indexPathForSelectedRow 프로퍼티를 사용한다.

TableView가 아니라 소문자로 시작하는 tableView일까요? 그 이유는 @IBOutlet 키워드와 함께 생성한 UITableView의 프로퍼티를 나타내기 때문입니다. 그래서 프로퍼티를 생성하실 때 설정하신 이름으로 적어주시면 됩니다. 그러면 prepare(for:sender:) 메서드를 사용할 때 아래와 같이 indexPath를 얻을 수 있죠.

// MARK: - View controller: segue
extension ArtworksTableViewController {
  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let indexPath = tableView.indexPathForSelectedRow
    
        if segue.identifier == "showDetail" {
      let followingViewController = segue.destination as? ArtworkDetailViewController
      guard let rowOfIndexPath: Int = indexPath?.row else {
        os_log(.fault, log: .ui, "indexPath가 nil입니다.")
        return
      }

      followingViewController?.artwork = artworks[rowOfIndexPath]
    }
  }
}

그럼 두 번째 방법을 살펴볼까요?

2. prepare(for:sender:) 메서드의 sender를 활용한다.

앞서 말씀드린 prepare(for:sender:) 메서드에서 sender는 무엇을 의미할까요? 앞서 작성한 코드에서 LLDB를 통해 살펴본 sender의 정체를 이미지로 가져왔습니다!

결과적으로 sender는 해당 메서드를 실행(이 메서드의 경우 segue)시키는 주체를 나타내는 것으로 확인됩니다. 기본적으로 매개변수 타입 지정에 의해 Any? 타입이며 이 경우에는 Any? 속에 UITableViewCell 타입이네요. Any? -> UITableViewCell로 다운캐스팅하면 indexPath를 얻을 수 있으니 아래와 같이 코드를 작성할 수 있겠습니다.

// MARK: - View controller: segue
extension ArtworksTableViewController {
  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard let indexPath = tableView.indexPath(for: sender as! UITableViewCell) else {
      os_log(.fault, log: .ui, OSLogMessage.indexPathIsNil)
      return
    }
  
    if segue.identifier == Identifier.Segue.artworkDetail {
      let followingViewController = segue.destination as? ArtworkDetailViewController
    
      followingViewController?.artwork = artworks[indexPath.row]
    }
  }
}

오늘도 새로운 것을 알아보니 정말 즐겁네요. 여러분도 즐거운 하루 보내세요~!

profile
합리적인 해법 찾기를 좋아합니다.

0개의 댓글