행 클릭했을 때 보여줄 DetailViewController 설정
인터페이스빌더에 있는 뷰컨트롤러를 코드에서 참조하기 위해서는 Storyboard ID를 작성해줍니다.
UIImageView
: UIKit의 일부이며, 이미지를 보여주는 뷰입니다.
AutoLayout (오토레이아웃)
앱이 실행될 수 있는 iOS기기는 모두 크기가 다양합니다.
따라서 여러가지 화면크기에 대해 규칙을 정하지 않으면 뷰가 다르게 보이는 문제가 발생합니다.
뷰를 레이아웃하는 방법에 대한 규칙을 정의하고 이러한 규칙을 자동으로 준수해줍니다.
@IBOutlet
Interface Builder 컨텐츠를 코드로 옮겨서 사용할 수 있습니다. (코드와 스토리보드를 연결)
코드 줄과 Interface Builder 사이에 연결이 있음을 Xcode에 알리는 데 사용됩니다.
class DetailViewController: UIViewController {
@IBOutlet var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
타입이 IUO인 이유?
타입이 IUO라면 값이 있거나, 없을 수 있지만 사용하는 경우에는 확실히 값이 있다고 확신합니다.
예를 들면, DetailViewController가 생성될 때, 뷰는 아직 로드되지 않았습니다.(단지, CPU에 실행중인 코드)
기본작업이 완료된 후, iOS는 스토리보드에서 레이아웃을 로드하고, 스토리보드에서 코드로 모든 outlet들을 연결합니다.
따라서 DetailViewCOntroller를 만들 때 UIImageView는 아직 생성되지 않았기 때문에 존재는 하지 않지만 메모리에는 여유 공간이 필요합니다. 이 때 값은 nil ,비어있는 메모리입니다. 그러나 뷰가 로드되거나 outlet이 연결될 때 값이 nil이 아니게 됩니다.
행 선택했을 때 동작
테이블뷰 행을 선택했을 때 동작하기 위해서는 UITableViewDelegate
의 tableView(_, didSelectRowAt:)
메서드를 작성합니다.
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {}
네비게이션컨트롤러를 통해 데이터 전달
데이터를 전달받을 뷰컨트롤러에서 같은 타입의 프로퍼티를 설정합니다.
데이터를 전달할 부분에서 뷰컨트롤러 인스턴스를 생성합니다.
instantiateViewController(withIdentifier:)
storyboard ID로 인스턴스를 만든 후 어떤 뷰컨트롤러인지 타입캐스팅을 해줍니다. (왜냐하면 어떤 타입인지 모르기 때문입니다.)
전달받을 뷰컨트롤러 프로퍼티에 값을 저장합니다.
화면을 전환합니다.
이미지 풀스크린으로 보기
UINavigationController의 hidesBarsOnTap을 이용하면 화면을 Tap하면 네비게이션바가 숨겨집니다.
⚠️ 사용한 뷰컨트롤러에서 화면이 전환될 때 다시 비활성화해줘야 됩니다. 다른 곳에서 Tap할 때 겹치는 문제가 발생할 수 있기 때문입니다.
테이블뷰 셀의 Accessory옵션을 사용하여 셀의 목적을 명확히 해주는 기호를 추가할 수 있습니다.
네비게이션바에 표시되는 타이틀을 큰 제목으로 사용하는 방법
navigationController?.navigationBar.prefersLargeTitles = true
다른 뷰컨트롤러에서 사용하고 싶지 않은경우
navigationItem.largeTitleDisplayMode = .never
🌟 뷰컨트롤러 제목이 너무 긴경우에 네비게이션 바 뒤로가기 버튼이 타이틀이 아닌 Back으로 지정됩니다.