UINavigationBar, UINavigationItem, UIBarButtonItem

jane·2022년 2월 9일
0

iOS

목록 보기
14/32

UINavigationBar, UINavigationItem, UIBarButtonItem

네비게이션 바를 설정할때 나오는 이 세개의 타입들이 헷갈려서 한번 정리해보려 한다.
UINavigationBar <- UINavigationItem <- UIBarButtonItem 순으로 더 큰 개념이라고 볼 수 있겠다

네비게이션 컨트롤러꺼

https://s3.ap-northeast-2.amazonaws.com/media.yagom-academy.kr/resources/usr/6152fa94ccd9ef11a51aee7f/20220209/62035b949276e54c1b072990.png

navigationBar 는 보통 네비게이션 컨트롤러가 가지고있음 (근데 네비게이션 컨트롤러 없이도 사용가능)

네비게이션 컨트롤러는 navigationBar의 모습을 configure하고

뷰컨트롤러는 navigationItem 프로퍼티를 통해 navigationBar의 컨텐츠를 configure한다.

뷰컨꺼

https://s3.ap-northeast-2.amazonaws.com/media.yagom-academy.kr/resources/usr/6152fa94ccd9ef11a51aee7f/20220209/62035b959276e54c1b072994.png

https://s3.ap-northeast-2.amazonaws.com/media.yagom-academy.kr/resources/usr/6152fa94ccd9ef11a51aee7f/20220209/62035b8f9276e54c1b07298c.png

navigationItem은 뷰컨의 부모(네비게이션 컨트롤러)가 가지고있는 navigation bar를 대신하는 인스턴스임 그래서 뷰컨은 navigationItem 프로퍼티를 가지고 있다

뷰컨에서 이 프로퍼티가 처음 접근되는 그 순간 UINavigationItem 객체가 생성이 된다고한다.

따라서 뷰컨을 화면에 띄울때 네비게이션컨트롤러를 쓰지 않는다면 이 프로퍼티에 절대 접근하면 안된다.

이해가 안되는 부분

근데.. 뷰컨의 뷰를 생성할때 네비게이션 아이템에 바버튼 아이템을 생성하지 말라는게 무슨 소리지

네비게이션 스택에 두개의 뷰컨이 push되었을때 가장 위의 뷰컨이 보여지고 네비게이션 바에 백버튼을 띄우기 위해서 뒤 뷰컨의 네비게이션 아이템인 title이 가져와진다는 말은 이해가 가는데..

그니깐 뷰컨의 뷰랑 네비게이션 아이템은 독립적으로 가져와지므로 같이 생성하지 말라는건가...

https://s3.ap-northeast-2.amazonaws.com/media.yagom-academy.kr/resources/usr/6152fa94ccd9ef11a51aee7f/20220209/62035b959276e54c1b072996.png

UIBarButtonItem

https://s3.ap-northeast-2.amazonaws.com/media.yagom-academy.kr/resources/usr/6152fa94ccd9ef11a51aee7f/20220209/62035c759276e54c1b072999.png

마지막으로... 뷰컨이 가지고있는 UINavigationItem 인스턴스는 backBarButtonItem, leftBarButtonItem 등 프로퍼티를 가지고 있고 그 프로퍼티들의 타입이 바로 UIBarButtonItem이다

UIBarButtonItem 은 기본적으로 구현되어있는 여러가지 아이콘들이 존재한다.

이니셜라이저에서 barButtonSystemItem 을 지정해주기만 하면 됨 ... 초간단하죠

https://developer.apple.com/design/human-interface-guidelines/ios/icons-and-images/system-icons/

따라서 뷰컨에서 코드로 이렇게 네비게이션 아이템의 오른쪽 바버튼아이템을 설정해줄 수 있다.

private func setUpNavigationItem() {
    navigationItem.title = "메모"
    navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: nil)
}
profile
제가 나중에 다시 보려고 기록합니다 ✏️

0개의 댓글