부제: prepare(for:sender:)
의 sender
는 무엇일까?
TableView
에서 Cell
을 선택하면 상세 페이지로 이동하게끔 구성해야 하는 경우가 있습니다. 그럼 선택된 Cell
이 무엇인지 알기 위해 indexPath.row
값을 찾아야 하는데요, 이번에는 해당 상황에서 어떻게 indexPath
를 얻을 수 있는지 알아보겠습니다.
이전 포스팅에서 다음 화면으로 정보를 넘겨주는데 UIViewController
의 prepare(for:sender:)
메서드를 사용할 수 있다는 것을 알아봤습니다. 동일하게 해당 메서드를 활용해볼게요.
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]
}
}
}
그럼 두 번째 방법을 살펴볼까요?
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]
}
}
}
오늘도 새로운 것을 알아보니 정말 즐겁네요. 여러분도 즐거운 하루 보내세요~!