본문 바로가기
프로그래밍 놀이터/iOS

[iOS Study] UINavigationController

by 돼지왕 왕돼지 2016. 2. 22.
반응형

 [iOS Study] UINavigationController


출처 : 아론 힐리가스의 iOS 프로그래밍


@selector, Action, animation, assistant editor, command option return, command return, connection, control drag, drill-down interface, drop, editButtonItem, Editor 컨트롤, endEditing:, exception, File'sOwner, first responder, IBAction, iboutlet, initWithBarButtonSystemItem:target:action:, ios study, ios tutorial, layout, layouting, leftBarButtonItem, M, navigationcontroller, navigationitem, option click, optionxib, outlet, Push, pushViewController:animated:, rightBarButtonItem, rootviewcontroller, SEL, setEditing:animated:, Simulated Metrics, Stack, tableview, tableView:didSelectRowAtIndexPath:, Title, titleView, toggle, Top Bar, topViewController, Translucent Navigation Bar, UIBarButtonItem, UIBarButtonSystemItemAdd, UINavigationBar, UINavigationController, UINavigationItem, uitabbarcontroller, uitoolbar, View, viewcontrollers, viewwillappear:, viewWillDisappear:, XIB, [iOS Study] UINavigationController, 갱신, 단축키, 드릴 다운 인터페이스, 반환 타입, 배열, 보조 편집기, 삭제, 셀럭터 포인터, 셀렉터, 셀렉터 포인터, 소스, 스택, 아론 힐리가스, 애니메이션, 액션, 연결, 유틸리티 영역, 인스턴스 변수, 인자 이름, 인자 타입, 인터페이스, 잘못된 커넥션, 커스텀뷰, 키보드, 타깃, 퍼스트 리스폰더, 푸쉬, 하위 페이지


-

각 설정은 세부 페이지를 가지고 그 세부 페이지는 또 관련된 하위 페이지를 가진다.

이러한 형태의 인터페이스를 드릴 다운 인터페이스(drill-down interface)라 한다.



-

앱에서 여러 정보 화면을 나타낼 때 UINavigationController 가 그 화면들의 스택을 관리한다.

각 화면은 UIViewController 의 view 이고, 그 스택은 뷰 컨트롤러의 배열이다.

UIViewController 가 스택 꼭대기에 있을 때 그 컨트롤러의 view 가 보여진다.



-

UINavigationController 의 인스턴스를 초기화할 때 그 인스턴스에 UIViewController 를 전달해줘야 한다.

이 UIViewController 가 내비게이션 컨트롤러의 루트 뷰 컨트롤러이다.

루트 뷰 컨트롤러는 항상 스택의 맨 바닥에 놓인다.

프로그램 실행 중에 더 많은 뷰 컨트롤러를 UINavigationController 의 스택 꼭대기에 푸시할 수 있다.



-

UIViewController 가 스택에 푸시되면 그 컨트롤러의 view 가 오른쪽에서부터 화면에 나타난다.

스택이 팝되면 맨 위의 뷰 컨트롤러가 스택에서 제거되고 그 view 는 오른쪽으로 사라진다.

그리고 스택의 다음 뷰 컨트롤러의 view 가 나타난다.



-

UINavigationController 는 UITabBarController 와 마찬가지로 viewControllers 배열을 가진다.

루트 뷰 컨트롤러는 이 배열의 첫 번째 객체이다.

뷰 컨트롤러들을 스택에 더 넣을 때마다 이 배열의 끝에 추가된다.

따라서 배열의 마지막 뷰 컨트롤러는 스택의 꼭대기가 된다.

UINavigationController 의 topViewController 프로퍼티는 스택의 꼭대기를 가리키는 포인터이다.



-

UINavigationController 는 UIVIewController 의 하위 클래스이기 때문에 자기 소유의 view 를 가진다.

그 view 는 항상 두 개의 하위뷰를 가진다.

UINavigationBar 와 topViewController 의 view 이다.



-

프로젝트 네비게이터에서 Option + Click 을 하면, 보조 편집기(assistant editor)에서 파일을 연다.

이것은  XIB 과 소스를 연결할 때 유용하다.

( 보조 편집기는 워크 스페이스 상단에 위치한 Editor 컨트롤의 중간 버튼을 클릭하여 토글할 수 있다.

보조 편집기를 표시하는 단축키는 Command + Option + Return 이고, 다시 표준 편집기로 돌아가려면 Command + Return 이다. )



-

유틸리티 영역 Show/Hide 는 워크스페이스 상단의 View 컨트롤에서 오른쪽 버튼을 클릭하면 된다.

또는 Command + Option + 0 을 누르면 된다.



-

Simulated Metrics 를 통해 Top Bar 를 Translucent Navigation Bar 등으로 설정하면,

Navigation Bar 에서 어떻게 표시되는지 볼 수 있어 layouting 하기 좋다.



-

XIB 에서 Control + Drag 하여 IBOutlet 또는 action 을 연결하고 싶은 m 파일로 drop 하면 자동으로 연결을 시킬 수 있다.



-

File'sOwner 를 컨트롤 클릭한다.

커넥션에 노란 경고 표시가 있다면 커넥션 옆의 x 아이콘을 클릭하여 그 커넥션을 끊는다.



-

XIB 파일에 잘못된 커넥션이 없어야 한다.

보통 잘못된 커넥션은 인스턴스 변수명을 바꾸고 XIB 파일에서 그 커넥션을 갱신하지 않았을 때 발생한다.

또는 인스턴스 변수를 완전히 삭제했는데 XIB 파일에서 그 커넥션을 제거하지 않았기 때문에 발생한다.

어느 쪽이든 잘못된 커넥션이 있으면 프로그램이 XIB 파일을 로드할 때 강제 종료하게 될 것이다.



-

XIB 에서 delegate 를 지정하고 싶은 view 를 Control + Drag 하여 File’s Owner 에 놓고 목록에서 delegate 를 설정하면 바로 연결시킬 수 있다.







-

테이블뷰에서 언제 행이 눌리는지는 델리게이트의 tableView:didSelectRowAtIndexPath: 메시지를 통해 알 수 있다.

네비게이션 컨트롤러 스택에 있는 각 뷰 컨트롤러는 자신에게 navigationController 메시지를 보내 그 내비게이션 컨트롤러에 대한 포인터를 얻을 수 있다.



-

[navigationController pushViewController:viewController animated:YES]; 를 통해 뷰 컨트롤러를 스택에 추가한다.

UINavigationController 의 스택은 배열이기 때문에 추가된 뷰 컨트롤러에 대한 소유권을 가진다.

뷰 컨트롤러를 스택에서 뺄 때 그 컨트롤러는 소멸된다.



-

뷰 컨트롤러가 다음 뷰 컨트롤러를 스택에 넣는 것은 흔한 패턴이다.

루트 뷰 컨트롤러는 보통 다음 뷰 컨트롤러를 만들고 그 다음 뷰 컨트롤러도 그 이후의 뷰 컨트롤러를 계속해서 만든다.



-

UINavigationController 가 뷰를 교체하기 직전에 viewWillDisappear: 와 viewWillAppear: 라는 두 개의 메시지를 보낸다.

UIViewController 가 스택에서 사라질 때 viewWillDisappear: 메시지를 보내고,

스택 꼭대기에 새롭게 위치하는 UIViewController 가 viewWillAppear: 를 받는다.



-

뷰가 endEditing: 메시지를 받으면, 뷰 자신이나 그 하위뷰가 현재 퍼스트 리스폰더라면

퍼스트 리스폰더 상태가 해제되고 키보드가 사라지게 된다.

(퍼스트 리스폰더가 강제로 물러나게 될지는 이 메소드에 전달된 인자에 따라 결정된다.

일부 퍼스트 리스폰더는 해제를 거부할 수도 있다. 하지만 YES 를 전달하면 그 거부를 부시한다.)



-

모든 UIViewController 는 UINavigationItem 타입의 navigationItem 프로퍼티를 가지고 있다.

UINavigationItem 은 UIView 의 하위 클래스가 아니다.

네비게이션 아이템은 그려야 할 내용과 함께 내비게이션바를 제공한다.

기본적으로 UINavigationItem 은 비어있다.

title 프로퍼티를 적절한 문자열로 바꾸면 교체된다.



-

각 UINavigationItem 은 세 개의 커스터마이징 영역, 즉 leftBarButtonItem, rightBarButtonItem, titleView 를 가진다.

왼쪽과 오른쪽 바 버튼 아이템은 UIBarButtonItem 인스턴스의 포인터들이다.

UIBarButtonItem 은 UINavigationBar 나 UIToolbar 에서만 표시할 수 있는 버튼에 관한 정보를 포함한다.



-

UIBarButtonItem 도 뷰는 아니지만 UINavigationBar 에 버튼이 어떻게 표시되어야 할지에 대한 정보를 가진다.

( UIToolbar 도 자신을 구성하는데 UIBarButtonItem 인스턴스를 사용한다. )



-

기본 문자열을 제목으로 사용하거나 네비게이션 아이템의 중앙에 놓이는 UIView 의 하위 클래스를 만들 수도 있다.

하지만 둘 다 가질 수는 없다.

특정 뷰 컨트롤러가 커스텀뷰(버튼, 슬라이더, 이미지, 맵 등)을 갖는 것이 적절하다면 네비게이션 아이템의 titleView 를 그 커스텀뷰로 설정할 수 있다.


일반적으로는 제목 문자열만으로 충분하다.



-

바 버튼 아이템은 UIControl 의 타깃-액션 기법처럼 동작하는 타깃-액션 쌍을 가지고 있다.

버튼이 눌리면 타깃에 액션 메시지를 보낸다.


프로그래밍으로 타깃-액션 쌍을 설정하려면 타깃과 액션을 버튼을 보내야 한다.


UIBarButtonItem *bbi = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd

target:self

action:@selector(addNewItem:)];

navItem.rightBarButtonItem - bbi;



-

액션은 SEL 타입의 값으로 전달한다.

SEL 데이터 타입은 셀럭터의 포인터이고 셀럭터는 콜론을 포함한 메시지 전체 이름이다.

@selector()는 반환 타입, 인자 타입, 인자 이름을 신경 쓰지 않는다는 것에 주의한다.



-

navItem.leftBarButtonItem = self.editButtonItem;


UIViewController 는 editButtonItem 프로퍼티를 가지며 editButtonItem 메시지를 받으면,

뷰 컨트롤러는 Edit 라는 제목을 가진 UIBarButtonItem 을 만든다.

게다가 이 버튼은 타깃-액션 쌍과 함께 온다.

이 버튼을 누르면 setEditing:animated: 메시지를 UIViewController 에 보낸다.








반응형

댓글