AppleApp/Cocoa Touch2010. 7. 8. 14:50
아이폰 인터페이스는 크게 세 가지로 구성된다.
하나는 UIWindow, 다른 하나는 UIViewController, 마지막으로 UIView이다.

아이폰 어플리케이션에서는 AppDelegate를 통하여(말 그대로 application인스턴스의 일부분을 위임한 것이다.)
하나의 (UIWindow *)window인스턴스만을 가질 수 있다.

이 window인스턴스만으로는 아무것도 할 수가 없으며,
사용자에게 실질적인 내용을 보여주기 위해서는 (UIView *)view가 필요하다.
window인스턴스에 view를 띄우기 위해서는 다음과 같은 코드를 이용하면 된다.
[window addSubview:view];

하지만 이와 같은 방식은 그저 그림 보여주기일 뿐 view에서는 사용자의 이벤트를 처리한다거나 하는 일련의 작업들을 처리할 수 가 없다. (물론 프로그래머에 따라 - 특히 게임 프로그래머 - view에다가 이벤트 처리 메소드를 넣는 경우도 있다.) 이를 위해서 (UIViewController *)viewController를 사용하게 된다.
이를 사용하기 위한 방법은 (UIViewController *)viewController인스턴스에 작성된 view를 연결시키기만 하면 된다. (viewController.view에 (UIView)view인스턴스의 주소값을 복사하면 된다.) 
window인스턴스에 view를 띄우기 위해서는 다음과 같은 코드를 이용하면 된다.
[window addSubview:viewController.view];
이벤트처리까지 하고자 한다면 ViewController.m에 이벤트 처리를 위한 메소드만 추가하면 된다.

UIViewController클래스가 view인스턴스를 하나만 제공하기 때문에 하나의 viewController인스턴스에 하나의 view인스턴스라는 인식이 강하지만, 개발 형태에 따라 하나의 viewController에 여러 (UIView *)인스턴스를 하위로 연결할 수도 있고(view로부터 이벤트를 받아서 다른 view인스턴스로 전환하는 메소드를 실행한다.) viewController에 하위로 다른 (UIViewController *)인스턴스를 연결할 수도 있다.

그래서 이 세 가지 인터페이스 중점 요소에 대하여서는 다음과 같이 이해하면 쉽다.
1. UIWindow: 어플리케이션이 보여지기 위한 창
2. UIView: 어플리케이션이 보여주는 실제 내용물
3. UIViewController: 내용물과 관련한 이벤트 처리기
Posted by studio2b 마이클

댓글을 달아 주세요

  1. 좋은 정보 고맙습니다.

    2011.08.20 16:14 [ ADDR : EDIT/ DEL : REPLY ]

AppleApp/Cocoa Touch2010. 7. 8. 14:09
어플리케이션이 시작되면 (UIApplication *)application인스턴스를 생성하고 application이 소유한 메인 NIB(.nib 또는 .xib확장자로 Next Interface Builder의 약자이다.)파일을 찾아서 로드하게 된다. 이 파일은 프로젝트 내의 Info.plist 중 Main nib file base name 항목에 정의된 값을 기준으로 찾아낸다. 이렇게 찾아낸 NIB파일에서 정보를 읽어들여 (UIApplication *)application과 연결된 모든 객체를 불러온다.

1. (UIApplication *)application인스턴스가 Info.plist를 통해서 메인 NIB파일을 찾는다.

2. 메인 NIB파일에서 UIApplication 클래스의 (NSObject *)delegate인스턴스에 연결된 AppDelegate클래스를 찾는다.

3. AppDelegate 클래스에서 (UIWindow *)window인스턴스에 연결된 Window클래스를 찾는다.

4. AppDelegate 클래스에서 (UIViewController *)viewController인스턴스에 연결된 ViewController클래스를 찾는다.

5. ViewController클래스는 view인스턴스(UIViewController에서 상속받는다.)에 연결된 View클래스를 찾는다.

6. 모든 파일 찾기가 끝나면 application인스턴스가 delegate인스턴스에 applicationDidFinishLaunching메서드를 호출한다.
(iPhone SDK 4이후에서는 application:didFinishLaunchingWithOptions:도 호출한다.)

7. 현재 사용중인 viewController인스턴스의 안에 생성된 메서드에 따라 작동한다.

위의 내용은 사실 프로젝트 파일 내에서 보이는 대략적인 개괄만을 늘어놓은 것이다. 실제로 프로그램이 돌아갈 때에는 눈에 보이지 않는 많은 절차들이 지나가며, 이 절차들은 Xcode에서 Debug Console을 열면 확인할 수 있다.
Posted by studio2b 마이클

댓글을 달아 주세요

AppleApp/Cocoa Touch2010. 7. 8. 12:59
iPhone SDK4로 넘어오면서 코드가 조금 바뀐 것이 있다. 바로 ProjectNameAppDelegate.m에서 활용도가 높았던 applicationDidFinishLaunching이 그 주인공이다. 어떻게 바뀌었는지 살펴보자.
구 버전의 SDK같은 경우는 새로 프로젝트를 생성하게 되면 다음과 같은 메소드를 제공할 것이다.
- (void)applicationDidFinishLaunching:(UIApplication *)application {
//Override point for customization after app launch
[window makeKeyAndVisible];
}
다른 메소드(viewDidLoad, viewWillAppear)들과 비교했을 때 일관성 있는 작명 방식이다.

하지만 iPhone SDK 4에서는 다음과 같은 메소드 형태를 제공한다.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//Override point for customization after app launch
[window makeKeyAndVisible];

return YES;
}
메소드가 application:didFinishLaunchingWithOptions:로 바뀌었다. 또 다른 특징은 리턴return 값 형식이 void에서 BOOL로 바뀌었다는 것이다. 그래서 이번에 바뀐 메소드에는 return YES;가 추가되었다.

물론 기존 코드도 잘 작동하는 것으로 봐서는 현재 어플리케이션 실행이 끝나면 두 메서드 모두를 호출하는 것으로 판단된다. 하지만 앞으로는 아래 방식을 애플에서 장려하는 듯 하므로, 아래 형식의 메소드를 활용해야 하겠다.







Posted by studio2b 마이클

댓글을 달아 주세요