* 아이폰 프로젝트의 구조
* 예제 - AppDelegate.m
- MainWindow.xib : UI가 만들어지는 출발
- File's Owner : 각종 디자인 객체들을 제어하기 위한 클래스
- First Responder : 현재 활성화되어 사용자로부터 무엇인가 리액션을 받고 있는 객체의 클래스. 어떤 개체(예를 들어 키보드)가 First Responder가 되면 가상키보드가 뜨고 사용자로부터 입력을 기다린다. 프로그램에서 키보드의 First Responder를 해제하면 자동으로 키보드가 사라진다
- XCode와 인터페이스 빌더는 별개의 프로그램이므로, 인터페이스 빌더에서 만든 객체와 XCode 상의 코드를 연결시키는 작업을 해 주어야 한다. 하지만 XCode의 모든 코드들이 인터페이스 빌더로 넘어오지는 못한다. 이 때문에 IBOutlet(변수)과 IBAction(메소드) 키워드가 존재한다. 이것이 붙으면 인터페이스 빌더에서 인식하게 되며, XCode상에서는 별다른 의미를 갖지 못한다(타입도 void임)
- 주 실행이 되는 main 함수는 main.m에 위치하게 된다
- AppDelegate : 주 프로그램 실행을 위한 처리들을 담당. 시작하기 전에 팝업창을 띄워 뭔가를 확인한다든가 할 때에 사용한다. 다른 모든 클래스는 File's Owner에 있지만 유일하게 윈도우에 대한 것은 AppDelegate에 있다
- UIApplication : 아이폰에서 실행되도 좋은 프로그램인지 검사
- WillTerminate : 종료 직전에 호출되는 메소드. 프로그램 종료 후 나중에 다시 실행했을 때 마지막에 하고 있던 작업이 그대로 남아있게 하는 처리를 여기에서 한다. 같은 이유로 프로그램 종료시에 없어져야 하는 객체, 해제해야 하는 메모리의 작업도 여기에서 해 주어야 한다. 이때 뜨는 윈도우의 디자인을 바꾼다거나 할 때에는 //Override point for customization after app launch 주석 바로 다음에 해준다.
- [window addSubview:viewController.view]; <-- 뷰 위에는 얼마든지 다른 것이 올라갈 수 있지만 윈도우는 하나밖에 깔 수 없다
* 인터페이스 빌더의 xib 편집창
- 기본적으로 항상 가운데의 계층형으로 창 표시 타입을 놓고 보는 버릇을 들이자
* 변수 연결하기
- IBOutlet으로 지정해서 인터페이스 빌더와 연결
- dealloc으로 해제
* Inspector 창
- 첫번째 탭 속성창
- Drawing - Opaque를 체크 : 뒤쪽을 투명하지 않게 하므로 속도가 빨라진다. 다만 텍스트 필드에서는 사용하지 않는 것이 좋다
- Clear Context Before Drawing : 무엇인가 객체를 그릴 때 뒤쪽을 지우고 새로 그리는가 아닌가를 설정
- Clip Subview : 화면상에서 보이지 않는 부분을 그리지 않는다.
- Interaction - User Interaction Enabled : 유저 터치 입력을 받는다. 항상 켜두어야 함
- Multiple Touch : 멀티터치 입력을 가능하게 한다
* XCode - .plist 파일
- 아이콘에 쓸 png파일은 Finder에서 찾아서 XCode의 Resources 트리에 끌어다 놓으면 등록된다
- plist 파일의 Icon file 란에 등록한 파일명을 입력하면 완료
- 아이콘 사이즈는 60x60 이상을 넘어가면 안된다
- 이미지는 기본적으로 확대/축소에 기대하지 말고 큰 것과 작은 것을 두개 다 준비해 두는 것이 좋다
- Bundle이라는 용어가 많이 등장하는데 기본적으로 '내 애플리케이션'을 일컫는다고 생각하면 된다
- Bundle Version을 사용해서 버전번호를 표기한다. 업데이트가 필요할 때에도 아이폰이 이 버전번호를 비교하여 업데이트 여부를 유저에게 알려주게 된다
- plist 파일은 우클릭한 뒤 Open as -> Plain Text File 하면 XML 파일로 읽게 된다
* 디자인 패턴
- 이벤트를 생성하는 것을 디자인 패턴이라고 한다
- Delegation : 하나의 객체가 delegate 지정된 다른 객체에 주기적으로 메시지를 전달 -> 메시지를 처리할 수 있다면 처리해 달라고 요청하는 것
- 상위 클래스로부터 모두 상속받아서 사용하는 것이 아니라, 원하는 클래스 이름에 delegate를 붙여서 그 클래스의 원하는 부분만 선택(프로토콜)하여 받아오는 것
- -(void)applicationDidFinishLaunching:(UIApplication *)application
- -(void)applicationWillTerminate:(UIApplication *)application
- MVC 패턴 : 모션, 뷰, 컨트롤러로 구별해서 동작을 정의한다
. 테이블 뷰 형식의 프로그램을 이 방식으로 한다.
- Target-Action 패턴 : 객체에 메시지를 보내서 객체를 제어하게 한다. 일반적으로 이벤트 처리에 가장 많이 사용된다
- IBAction 키워드를 사용해서 넘기면 이 방식이 된다
. 리액션에 따라 개체가 바뀌는 경우(눌리는 버튼 등)에는 원래의 자기 객체가 무엇인지도 기억해놓고 있어야 하므로 -(IBAction) click(id)sender와 같이 sender를 사용해줘야 한다. 이 때에는 형변환을 해줘야 한다
- 코딩으로 만들어도 된다. [객체 AddTarget : 메소드소유객체명 action : @selector(메소드명) forControlEvents : (UIControlEvents) 이벤트 이름 과 같은 형식이 된다
- 소유 객체명은 Target-Action 방식에서는 거의 self가 되지만 MVC 패턴에서는 소유 객체와 구현부가 다르므로 self를 사용할 수 없다는 것에 주의
* 윈도우기반 어플리케이션
- 기본적으로 윈도우 하나만이 존재한다
- 만든 뒤 UIViewController의 서브클래스를 추가
- 새로 클래스파일을 추가할 때에 3개의 옵션 체크가 중요하다(xib 파일도 함께 만드느냐 그렇지 않느냐 등등)
- xib 파일도 함께 만들면 처음에는 classes 폴더에 함께 생기므로 Resources 폴더로 옮겨 준다
* 예제 - AppDelegate.h
//
// _709_2AppDelegate.h
// 0709_2
//
// Created by iMac2_13 on 10. 7. 9..
// Copyright __MyCompanyName__ 2010. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "TestViewController.h" // 추가한 뷰 컨트롤러의 헤더 파일을 import함
@interface _709_2AppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
TestViewController * viewController; // 윈도우에 추가할 뷰 컨트롤러의 변수 선언
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) TestViewController * viewController; // 추가한 뷰 컨트롤러의 멤버에 쉽게 접근하기 위한 프로퍼티 설정
@end
* 예제 - AppDelegate.m
//
// _709_2AppDelegate.m
// 0709_2
//
// Created by iMac2_13 on 10. 7. 9..
// Copyright __MyCompanyName__ 2010. All rights reserved.
//
#import "_709_2AppDelegate.h"
@implementation _709_2AppDelegate
@synthesize window;
@synthesize viewController; // 프로퍼티로 지정한 변수의 synthersize 지정
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch
viewController = [[TestViewController alloc]init]; // 추가한 뷰 컨트롤 변수에 메모리 할당, 초기화
[window addSubview:viewController.view]; // 윈도우에 추가한 뷰 컨트롤러의 뷰 붙이기. 중요함!
[window makeKeyAndVisible];
return YES;
}
- (void)dealloc {
[viewController release]; // 지정한 인스턴스 변수 release
[window release];
[super dealloc];
}
@end
* 이벤트 객체 알아내기
- IBOutlet 변수 이용하기
- 어떤 메소드로부터 호출된 것인지 알기 위해서 Tag라는 속성을 줄 수도 있다. 다만 이 경우에는 절대로 같은 Tag를 설정해 주면 안된다.
- Tag를 사용하게 되면 IBOutlet은 쓸 필요가 없어진다
-
'프로그래밍 > Objective-C' 카테고리의 다른 글
중앙정보학원 아이폰과정 8일차 - 2010년 7월 14일 (0) | 2010.07.14 |
---|---|
중앙정보학원 아이폰과정 6일차 - 2010년 7월 12일 (0) | 2010.07.12 |
중앙정보학원 아이폰과정 4일차 - 2010년 7월 8일 (0) | 2010.07.08 |
중앙정보학원 아이폰과정 3일차 - 2010년 7월 7일 (0) | 2010.07.07 |
중앙정보학원 아이폰과정 2일차 - 2010년 7월 6일 (0) | 2010.07.06 |