8. 대략 줄거리
프로젝트 생성후 Group & files를 보면
RootViewController는 내비게이션 구조의 최상
위 레벨 정의
DetailViewController는 내비게이션 항목을 선택
할때 오른쪽 영역에 크게 보여줄 내용을 정의
기기가 회전할경우 분활뷰와 팝오버뷰 형태로
변경된다.
11. DetailView.xib
MainWindow.xib가 로드되고 상세뷰 컨트롤러가 생성될때 이 컨트롤러가 같은
nib에서 GUI를 찾지 않고 이 필드에 지정된 nib파일을 로드한다는 뜻
이렇게 하면 어떤뷰가 메인뷰에 속하고 어떤뷰를 별도 nib파일로 관리할지 지
정할수 있다.
DetailView.xib는 MainWindow.xib안에 속한다고 봐도 된다.
이렇게 하는 이유는 코드와 관련없는 설정정보가 코드사이에 끼는것을 막을수
가 있다.
코딩과 화면을 분리할수가 있다.
16. RootViewController.m의 주요 부분
contentSizeForViewInPopover
- 뷰컨트롤러가 팝오버 컨트롤러에 대한 디스플레이를 제공할때 사용할 크기를
설정한다.
이 사각형은 가로 너비가 최소 320 픽셀이어야 하지만 이와 별개로 크기는 얼
마든지 원하는 대로 설정할수 있다.
shouldAutorotateToInterfaceOrientation
- 디스플레이가 옆으로 뒤집을때 방향 바꾸게 할거냐 말거냐 이 처리
방향 바꾸기 싫음 YES
tableView:didSelectRowAtIndexPath
- 앞에서 사용자의 행선택에 반응하는 테이블 뷰 컨트롤러 구현시 이메서드에
서 새로운 컨트롤러 생성하고 이를 내비게이션 컨트롤러의 스택에 쌓았다.
하지만 이 애플리케이션에서는 보여주려는 컨트롤러가 이미 화면에 배치된 상
태. 이컨트롤러는 바로 xib파일에 들어 있는 DetailViewController다.
따라서 여기서는 DetailViewController 인스턴스에게 보여줄 디스플레이만 알
려주면 된다.
19. 내부 클래스
클래스 내에서만 사용하고 헤더 파일을 통해 다른 클래스에게 노출되지 않는
속성과 메서드를 정의할수 있다.
여기서는
1. 앞에서 선언한 인스턴스 변수를 활용하는 popoverController속성을 선언
2. 디스플레이를 업데이트 할때마다 호출할 유틸리티 메서드를 선언
popoverController의 속성의 용도는 뒤에 가서....
20. setDetailItem 메서드
앞에 세터 프로퍼티와 신디사이즈를 만들었는데 왜 또 세터 메서드를 만들까?
여기서는 사용자가 세터메서드 호출시 임의의 동작을 해야하기 때문에 따로
정의한것이다.
내용 - popoverController가 (nil이 아닌경우 즉) 있는경우
이를 사라지게하는 내용.
21. popoverController는 어디서?
아이패드가 세로모드로 회전할때 호출되는 메서드
- UIPopoverController : 분할뷰의 왼쪽에 있는 뷰를 포함하도록 미리 설정된 컨
트롤러
- UIBarButtonItem : 이 팝오어뷰를 보여주도록 설정된 버튼이다.
GUI에서 UIToolBar가 포함된경우- 버튼항목을 툴바에 포함시키기만 하면 사용
자가 위의 버튼을 눌러서 네이게이션 뷰를 호출할수있다는것.
GUI에서 UITooBar가 없는 경우- 팝오버 컨트롤러는 여전히 인자로 넘어오므로
이를 GUI요소에 대입하면 해당요소를 통해 팝오버뷰를 보여줄수있다.
23. PresidentList 시나리오
1. PresidentList.plist 파일을 Suppoting Files폴더에 옮긴다.
2. RootViewController.h에 NSArray presidents객체 및 property를 생성한다.
3. RootViewControlle.m에 synthesize로 presidents객체를 받는다.
4. viewDidLoad메서드에 앞서 추가한 plist에서 대통령정보를 옮겨서 NSArray presidents에 옮겨 담
는다.
delegate메서드부분
5 행개수를 지정하는 numberOfRowsInSection 에서 presidents변수안의 데이터 갯수만큼 지정하
도록 변경.
6. 각셀에서 대통령 이름을 볼수있게 cellForRowAtIndexPath에 NSDictionary *president = [self.
presidents objectAtIndex:indexPath.row]; 추가
- cellForRowAtIndexPath : 테이블에 데이터를 추가하기위한 UItableViewCell을 만드는 메서드
7.didSelectRowAtIndexPath 상세뷰 컨트롤러 에 URL을 넘겨준다.
24. DetailView 시나리오
상세뷰에서 url대신에 좀더 유용한정보를 보여주고 싶다.
1. UIWebView webView,property를 h 에서 선언하고 m에서 sythesize로 받는
다.
2. detailView.m의 configureView메서드로 이동해서 url를 webView객체에 넣고
로드 시킨다.
3. barButtonItem.title을 바꾼다. 버튼 이름바꾸는것이다.
4. viewDidUnload dealoc에서 webView객체를 릴리즈시킨다.
25. 언어변경 버튼추가
내용 :툴바 우측의 버튼이 생성되고 버튼을누르면 언어별 목록이 담긴 테이블
뷰가 뜬다.
해당 테이블뷰의 언어 선택시 디테일뷰의 내용이 그 해당언어로 새로고침 된
다.
현재는 UIPopoverController만 있는 상황
새로운 내용을 추가하기 때문에 새로운 UIViewController를 생성하고 거기서
작업을 해야한다.
32. DetailViewController.m
1. import "LanguageListController.h"를 한다.
2. 앞서 정의한 프로퍼티와 메서드를 신디사이즈로 받고 메서드는 구현한다.
3. 앞서 Language컨트롤러에서 받은 언어 텍스트와 위키피디아 url을 합체시킬
내부 함수 modifyUrlForLanguage 를 구현단다.
4. setDetailItem에 modifyUrlForLanguage를 넣어서 url을 애초에 합체시키게
만든다.
그리고 기존의 버튼이 하나였다가 두개 가 되면서 팝오버가 하나가 되서 관련
테이블이 올라왔을때는 하나가 더올라올려고 하면 기존의 것을 사라지게하는
로직을 구현한다.
5.setLanguageString 최초에 설정된 언어선택을 위해서 만드는 메서드
4번에 추가한 메서드내용은 이미 로딩된 상태에서의 언어선택으로 인한 변동을
위해서
6. 버튼 메서드를 구현한다. 눌렀을경우 팝오버되면서 뷰가 뜨도록 하느 액션.