[iOS Study] UINavigationController |
출처 : 아론 힐리가스의 iOS 프로그래밍
-
각 설정은 세부 페이지를 가지고 그 세부 페이지는 또 관련된 하위 페이지를 가진다.
이러한 형태의 인터페이스를 드릴 다운 인터페이스(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 에 보낸다.
'프로그래밍 놀이터 > iOS' 카테고리의 다른 글
[iOS Study] 터치 이벤트와 UIResponder (0) | 2016.02.24 |
---|---|
[iOS Study] 카메라 (0) | 2016.02.23 |
[iOS Study] UITableView 편집 (0) | 2016.02.21 |
[iOS Study] UITableView 와 UITableViewController (0) | 2016.02.20 |
[iOS Study] 델리게이션과 텍스트 입력 (0) | 2016.02.19 |
댓글