Xcode 에서 기본으로 제공되는 템플릿 중에는 Navigation controller가 구현되어 있는 것이 있지만 템플릿을 사용하지 않고 직접 한번 간단하게 만들어 보는 것도 기본 개념을 잡기에 좋을 것 같다.
우선 Xcode 4.3 기준으로 아래처럼 Empty Application 으로 NavigationTest라는 이름의 project를 생성한다.
다음은 만들어진 Project에 아래처럼 파일을 추가한다.
먼저 Objective-C class를 선택하고...
UIViewController의 Subclass로 MainViewController Class를 생성한다. 이때 XIB도 포함하도록 한다.
NavigationTestAppDelegate.h 파일에 navigationController 객체를 property 선언해주고
NavigationTestAppDelegate.m 파일에서는 navigationController 객체를 synthesize 해준다.
추가로 MainViewController와 navigationController를 아래와 같이 초기화하고, navigationController를 rootViewController로 설정한다.
여기까지 하고 실행을 해보자.
MainViewController.xib 에는 아무런 object도 올리지 않았지만 View 상단에 Navigation Bar가 생긴것을 볼 수 있다.
이제 네비게이션 컨트롤러가 제대로 동작하고 있는지 확인해 보기 위해 SubViewController를 추가해서 MainView와 SubView 사이의 화면전환을 해보자.
먼저 Objective-C class를 선택하고...이번엔 UITableViewController의 Subclass로 SubViewController Class를 생성한다. 마찬가지로 XIB를 포함하여 생성한다.
우선 MainView에 Button을 올려 놓고, 그 버튼을 누르면 SubView로 넘어가도록 해보자.
MainViewController.h 파일에 Button이 눌렸을 때 반응할 Action으로 loadSubView 메소드를 선언하고
MainViewController.xib 파일을 열어 View의 중앙에 Round Rect Button 하나를 추가하고, 버튼을 IBAction으로 선언했던 loadSubView 메소드와 연결한다.
MainViewController.m 파일에는 아래와 같이 SubViewController.h 헤더파일을 import하고 loadSubView 메소드를 구현해보자.
SubViewController를 초기화한 후 NavigationController의 pushViewController 메소드를 사용해 subViewController를 스택에 푸시하여 화면에 띄워주도록 한다.
또, MainViewController의 View가 화면에 표시될 때 Navigation Bar에 "Main View" 라는 title이 표시되도록 해보자.
Navigation Bar에 title을 설정하기 위해서 self.navigationItem.title = @"Main View"; 를 추가한다.
SubViewController.m 파일에는 SubViewController의 View가 화면에 표시될 때 Navigation Bar에 "Sub View" 라는 title이 표시되도록 아래와 같이 viewDidLoad라는 초기화 메소드에 코드를 추가한다.
실행해보자.
코드를 추가한 대로 Navigation Bar에 "Main View" 라는 title이 표시되었다.
Go to SubView 버튼을 눌러보자.
원하던대로 추가했던 SubView가 title과 함께 정상적으로 표시되었다.
SubViewController의 Navigation Bar에는 우리가 추가하지 않았던 Main View라는 버튼이 추가되어 있는것이 확인된다.
이는 Navigation Controller에서 자동으로 생성된 버튼이며, 이전으로 돌아가는 기능을 가진 Back button이다.
Back button을 눌러보면 바로 이전의 MainViewController로 돌아가는 것을 확인할 수 있을 것이다.
여기서 한 가지 소소한 내용 하나를 짚고 넘어가자.
MainViewController.xib 를 선택해 화면 구성을 확인해 보면 Navigation Bar가 없이 버튼만 중앙에 있을 것이다.
하지만 실행을 시켜보면 우리가 IB로 추가하지 않고 코드로 생성한 Navigation Bar가 View의 상단에 표시가 되면서 화면 중앙에 위치해야 할 버튼이 Navigation Bar의 height만큼 아래로 밀려버려 원하지 않는 곳에 표시되는 것을 볼 수 있다.
이렇게 View에 각종 object들을 배치할 때 위치를 잡기에 불편함이 발생하는 것을 방지하기 위해 다음과 같이 해보자.
오른쪽 상단의 Attibutes Inspector를 선택한 후 Top Bar에서 Navigation Bar를 선택하면 아래와 같이 View에 Navigation Bar가 표시된다.
이는 실제로 Navigation Bar를 추가하는 것이 아니고, Xcode에게 View의 Top Bar로 Navigation Bar가 올려질 것이라는 것을 알려주는 것이다.
이 상태로 추가할 각종 object의 위치를 잡게되면 실제 실행했을 경우와 동일한 화면을 볼 수 있게된다.