XCODE2011.05.16 00:42

기본 문법 #1

[object message:parameter];

//C style

DrawMyGradient(myView, aquaGradient, 0.0, 1.0, YES);

//Objective - c

[myview drawMyGradient:aquaGradient formValue:0.0 toValue:1.0 opaque:YES];


-(void)drawMyGradient:((CGGradientRef)gradient fromValue:start toValue:end opaque:opaque  //메소드 선언


기본 문법#2

//C Style

SubStringFormTo(sourceStr, &destStr, 2, 5); //위에서 타입을 정하고 메모리 얼록하고 여기다가 넣어달라

//O

NSString *destStr = [sourceStr subStringFrom:2 to:5];

long hash = [[sourceStr subStringFrom:2 to:5] hash]; //hash라는 메소드를 또 던진다


-(NSString *)subStringFrom:(int)from to:(int)to


오브젝트의 생성과 소멸

리테인 카운트 관리    //생성시점과 소멸시점을 관리

//person 클래스의 me 오브젝트를 만들고 없애기

Person *me = [[Person alloc] init];초기화     //리테인 카운트 1 생명줄!

[me retain];                                             //리테인 카운트 2

[me release];                                          //리테인 카운트 1

[me release];                                         //리테인 카운트 0

alloc -> release 해줄 필요, retain 해주지않은건 release 해줄 필요가없음


클래스 선언

.h 확장자를 가지는 파일

//헤더의 시작 interface  Person 클래스이름 NSObject는 슈퍼클래스

@interface Person : NSObject <NSCopying> {    //person은 NSObject의 서브클래스

int age;                          //instance변수 IVAR

 NSString *name;

}


-(void)singAsong:(Song *)song; //메소드선언 리턴타입 보이드 매개변수로 Song을 받는다

@end


클래스의 구현

.m 확장자를 가지는 파일


@implementation Person


-(void)singAsong:(Song *)song

{                                                       //cocoa object

NSlog(@""&@ can sing a song", name);      //NSlog가 있고 C에있는 printf와 유사하다, 중간중간에 token을 사용할 수 있다. 

}

@end


코딩 규약 - 이름 짓기

첫 글자를 대문자로

TheSinger.proj   Person.h / Person.m


nameOfPerson

ageOfPerson

addressOfPerson

//매개변수이름도 첫글자 소문자로,


-(void)singASong:(Song *)song


아이폰은 singleWindow




출처 : http://blog.naver.com/PostView.nhn?blogId=naoh14&logNo=10100421043

'XCODE' 카테고리의 다른 글

아이폰 개발 Xcode 기본문법 #1,#2  (0) 2011.05.16
xcode에서 iphone app 이름 변경  (0) 2011.04.09
Xcode 삭제  (0) 2011.04.09
[Objective-C] Xcode프로젝트 창  (0) 2011.04.09
[펌] Xcode 에 Subversion 적용하기  (0) 2011.04.09
XCODE용 디버그 메크로  (0) 2011.04.09
Posted by 오늘마감

다음 네 개의 장에서는 iPhone의 UIKit과 Cocoa Touch를 이해하는 데 필수적인 내용에 대해 다루지만, 아마 당장이라도 프로그램을 만들 준비가 되었을 것이라 여겨지기 때문에 먼저 간단한 iPhone 애플리케이션을 작성해 보겠다. 이 예제를 통해 IBOutlet과 IBAction의 사용법 그리고 Xcode 및 인터페이스 빌더와 친숙해질 것이다.

 

[Note]
이 책에서 소개하는 거의 모든 따라하기 예제는 이 책의 공식 블로그(
http://blog.naver.com/ipgipg)에서 동영상 서비스되고 있으며, 정보문화사 홈페이지(http://www.infopub.co.kr)의 자료실에서 다운로드 받을 수 있다. 첫 번째 동영상-지금 보여줄 따라하기 예제 애플리케이션-은 단계별로 음성 설명을 포함하고 있으나, 나머지 동영상은 음성 없이 화면만 나온다. 그러나 이번 예제 동영상에서 설명하는 과정을 잘 익혀놓으면 나머지 동영상도 어려움 없이 따라올 수 있을 것이다.


1. Xcode를 실행한 다음, 메뉴에서 [File]-[New Project]를 선택하면 New Project 창이 나타난다([그림 1-5]).
 

 

[그림 1-5] New Project 창

 

2. View-based Application을 선택하여 클릭한다. Save As 창이 나타나면 애플리케이션 이름으로 QuickStart라고 입력한다([그림 1-6]).

 

[그림 1-6] Save As 창

 

3. Xcode가 새 프로젝트를 생성하면 [그림 1-7]과 같이 왼쪽의 Groups & Files 목록에서 Classes와 Resources 폴더를 각각 아래로 펼친다.
 

[그림 1-7] Xcode에서 Classes와 Resources 폴더를 펼친 상태의 화면

 

4. Resources 폴더에 있는 QuickStartViewController.xib를 더블 클릭하여 인터페이스 빌더를 불러온다.

 

5. [그림 1-8]과 같은 캔버스(canvas)가 나타나지 않는다면 [그림 1-9]와 같이 도큐먼트 창에서 View를 더블 클릭한다.
 

[그림 1-8] 인터페이스 빌더 상의 뷰 캔버스

 

 

[그림 1-9] 도큐먼트 창

 

6. 인터페이스 빌더의 메인 메뉴에서 [Tool]-[Library]를 선택하면 라이브러리 창을 나타낼 수 있다. 라이브러리 창의 상단에서 모든 Cocoa Touch 클래스를 보여준다. Library를 아래로 펼친 후 Cocoa Touch를 클릭한다([그림 1-10]).
 

[그림 1-10] 라이브러리 창

 

7. 라이브러리 창 중앙 부분의 내용을 아래로 스크롤하면 Round Rect Button이 나오는데 Round Rect Button을 그대로 뷰 캔버스로 드래그 앤 드롭한다([그림 1-11]).
 

[그림 1-11] 버튼 추가

 

8. 뷰 캔버스 상의 버튼을 더블 클릭하여 Click Me라고 입력한다.

 

9. 7과 마찬가지로 Label을 만든다([그림 1-12]).

[그림 1-12] 레이블 추가

 

10. 저장한 다음 인터페이스 빌더를 종료한다.

 

11. 다시 원래 프로젝트 창으로 돌아와 Groups & Files 목록의 Classes 폴더 안에 있는 QuickStart ViewController.m을 선택하면 오른쪽의 편집 창에 소스 코드가 나타난다([그림 1-13]).

 

[그림 1-13] QuickStartViewController.m 화면

 

12. QuickStartViewController.m 소스 내용을 [소스 코드 1-1]과 같이 수정한다.

 

[소스 코드 1-1] QuickStartViewController.m
#import "QuickStartViewController.h"
@implementation QuickStartViewController
@synthesize myLabel;
- (IBAction) sayHello: (id) sender {
 NSLog(@"Hello....");
 self.myLabel.text = @"Hello";
}
- (void) dealloc {
 [super dealloc];
 [myLabel release];
}
@end

 

13. 마찬가지로 QuickStartViewController.h 파일을 열어 [소스 코드 1-2]와 같이 수정한다.

 

[소스 코드 1-2] QuickStartViewController.h
#import <UIKit/UIKit.h>
@interface QuickStartViewController : UIViewController {
 IBOutlet UILabel * myLabel;
}
@property (nonatomic, retain) IBOutlet UILabel * myLabel;
- (IBAction) sayHello: (id) sender;
@end

 

14. Xcode 메인 메뉴에서 [Build]-[Build]를 클릭하여 방금 작성한 프로젝트를 빌드한다.

 

15. QuickStartViewController.xib를 더블 클릭하여 인터페이스 빌더로 불러온다.

 

16. 뷰 캔버스에서 버튼을 선택한 후 인터페이스 빌더 메인 메뉴에서 [Tool]-[Inspector]를 선택하여 인스펙터 창을 띄운다([그림 1-14]). 인스펙터 창이 뜨면 두 번째 탭을 클릭하여 버튼 인스펙터를 띄운다([그림 1-15]).

 

[그림 1-14] 인스펙터 창

 

 

[그림 1-15] 버튼 인스펙터 창

 

17. 이벤트 목록에서 Touch Up Inside로 마우스 포인터를 옮긴 후 오른쪽의 동그라미를 도큐먼트 창의 File’s Owner로 드래그 앤 드롭한다. 이때 나타나는 팝업 창에서 sayHello:를 선택한다([그림 1-16]).
 
 

[그림 1-16] 버튼과 IBAction 연결하기

 

18. 뷰 캔버스의 레이블을 클릭하면 인스펙터 창의 내용이 레이블에 맞게 변경된다. 마찬가지 방식으로 New Referencing Outlet을 도큐먼트 창의 File’s Owner로 드래그 앤 드롭한 후 팝업 창에서 myLabel을 선택한다. 팝업 창에서 view를 선택하지 않도록 주의한다.

 

19. 저장하고 인터페이스 빌더를 종료한다.

 

20. Xcode 상에서는 현재 사용 중인 SDK로 iPhone Simulator 3.0과 Debug가 선택되어 있을 것이다([그림 1-17]).

 
[그림 1-17] 사용 중인 SDK로 iPhone Simulator 3.0과 Debug가 선택된 화면

 

21. Xcode 메인 메뉴에서 [Build]-[Build And Run]을 선택하면 방금 작성한 예제 애플리케이션이 iPhone 시뮬레이터에 설치된 후 동작한다([그림 1-18]).
 


[그림 1-18] iPhone 시뮬레이터에서 동작하는 예제 애플리케이션

 

22. Xcode 메인 메뉴에서 [Run]-[Console]을 선택하여 디버거 콘솔창을 띄운다.

 

23. 버튼을 클릭하면 레이블의 내용이 Hello로 바뀌며 디버거 콘솔창에 로그가 기록되는 것을 확인할 수 있다([그림 1-19]).
 


[그림 1-19] 버튼을 클릭한 후의 예제 애플리케이션 모습

 

 

 

예제로 배우는 핵심 패턴 아이폰 프로그래밍

제임스 브래넌 | 정기훈 옮김

정보문화사 2010.04.28



출처 : http://blog.naver.com/PostView.nhn?blogId=infopub&logNo=100108505592
Posted by 오늘마감

기본 문법 #1

[object message:parameter];

//C style

DrawMyGradient(myView, aquaGradient, 0.0, 1.0, YES);

//Objective - c

[myview drawMyGradient:aquaGradient formValue:0.0 toValue:1.0 opaque:YES];


-(void)drawMyGradient:((CGGradientRef)gradient fromValue:start toValue:end opaque:opaque  //메소드 선언


기본 문법#2

//C Style

SubStringFormTo(sourceStr, &destStr, 2, 5); //위에서 타입을 정하고 메모리 얼록하고 여기다가 넣어달라

//O

NSString *destStr = [sourceStr subStringFrom:2 to:5];

long hash = [[sourceStr subStringFrom:2 to:5] hash]; //hash라는 메소드를 또 던진다


-(NSString *)subStringFrom:(int)from to:(int)to


오브젝트의 생성과 소멸

리테인 카운트 관리    //생성시점과 소멸시점을 관리

//person 클래스의 me 오브젝트를 만들고 없애기

Person *me = [[Person alloc] init];초기화     //리테인 카운트 1 생명줄!

[me retain];                                             //리테인 카운트 2

[me release];                                          //리테인 카운트 1

[me release];                                         //리테인 카운트 0

alloc -> release 해줄 필요, retain 해주지않은건 release 해줄 필요가없음


클래스 선언

.h 확장자를 가지는 파일

//헤더의 시작 interface  Person 클래스이름 NSObject는 슈퍼클래스

@interface Person : NSObject <NSCopying> {    //person은 NSObject의 서브클래스

int age;                          //instance변수 IVAR

 NSString *name;

}


-(void)singAsong:(Song *)song; //메소드선언 리턴타입 보이드 매개변수로 Song을 받는다

@end


클래스의 구현

.m 확장자를 가지는 파일


@implementation Person


-(void)singAsong:(Song *)song

{                                                       //cocoa object

NSlog(@""&@ can sing a song", name);      //NSlog가 있고 C에있는 printf와 유사하다, 중간중간에 token을 사용할 수 있다. 

}

@end


코딩 규약 - 이름 짓기

첫 글자를 대문자로

TheSinger.proj   Person.h / Person.m


nameOfPerson

ageOfPerson

addressOfPerson

//매개변수이름도 첫글자 소문자로,


-(void)singASong:(Song *)song


아이폰은 singleWindow




출처 : http://blog.naver.com/PostView.nhn?blogId=naoh14&logNo=10100421043
Posted by 오늘마감


설치된 Xcode를 실행하면 아래와 같은 화면이 뜹니다.

여기에서 Create a new Xcode Project를 클릭하면 다음과 같은 화면이 뜹니다.

 

 

저의 환경에서는 6종류의 Application을 만들 수 있는 Project Template이 있군요.

그럼 이제 6종류의 Templates에 대하여 살펴 보기로 하지요.

 

A) Navigation-based Application

This temple provides a starting point for an application that uses a navigation controller. It provides a iser interface configured with a navigation controller to display a list items.

네비게이션 컨트롤러를 기반으로 하는 어플, 계층 구조로 더 깊은 단계로 들어갔다가 나올 수 있는 형태의 어플을 만들 수 있다.

Navigation-based Application 템플릿은 아래 그림의 타이틀 모양과 같은 네비게이션 바를 표시할 때 사용한다. 주로 타이틀과 좌우에 간단한 버튼을 표기할 때 사용한다.




템플릿을 선택한 다음 자동으로 생성된 코드를 그냥 빌드 해보면 위의 오른쪽 그림과 같은 형태가 나온다.

Xcode 에서 빌드하기

Xcode 에서 빌드는 아래와 같이 상단의 아이콘을 클릭하거나 단축키 +를 ㄹ누르면 된다.





위의 왼쪽 그림과 같이 setting 형태의 버튼과 타이틀을 넣는 방법은 여러 가지가 있다. 먼저 Xcode SDK의 UI 구성툴인 Interface Builder(IB)를 이용하는 방법을 살펴보자. Xcode 에디터에서 코드를 수정하는 것이 조금은 필요하다. 위 그림에서 처럼 소스 브라우저 창에서 MainWindow.xib 라는 파일을 더블 클릭하면 인터페이스 빌더가 실행된다. *.xib 파일은 IB에서 사용하는 UI의 프로젝트 파일에 해당된다. IB는 크게 4개의 메인폼을 가지고 있다. 아래 그림 첫번째는 IB에서 사용된 각종 콘트롤들을 아이콘 형태로 보여주는 View 윈도우이며(아래그림1), 해당 View의 설정을 위한 UI 디자인창이 있다.(아래그림2) 그리고, Attribute를 설정하는 창과(아래그림3) 각종 라이브러리와 오브젝트들을 모아 놓은 Library 창이 있다. 여기서 Navigation Controller를 선택하고, Navigation item Attribute의 'Title' 항목과 'Back Button'항목을 아래 세번째 그림처럼 설정해준다. 여기서 설정한 내용은 실시간으로 UI 디자인창에 반영된다. 단, Back Button은 코드를 수정하면 볼 수 있다.







이렇게 만들어진 내용을 IB에서 'File | Save'메뉴로 저장하고 나와서 다시 빌드하면 'Wi-Fi Networks'라는 타이틀이 보일것이다. 그리고, 'Settings' 라는 아이템을 추가 하려면 RootViewController.m 파일에서 주석처리 되어 있는 함수를 아래와 같이 수정하면 된다. 각각의 프로퍼티를 변경해서 iPhone에서 사용되는 각종 Navigation 버튼을 구현할 수 있다.


- (void)viewDidLoad { 

[super viewDidLoad]; 

self.navigationItem.leftBarButtonItem = self.navigationItem.backBarButtonItem;

}



다음은 Controller란 무엇인가를 알 수 있는 간단한 그림입니다.

 

 

다음은 Navigation Controller가 사용되는 간단한 어플입니다.

 


 

B) OpenGL ES Application

This template provides a starting point for an application that uses an OpenGL ES-baces view. It provides a view into which you render your OpenGL ES scene, and a timer to allow you to animate the view.

게임 등을 게발하기 위해서 3D엔진인 OpenGL ES를 사용할 수 있다. (자세한 것은 다음에 만들어 보면서..)

 iPhone OS는 게임등과 같이 화면 전환이 빠르게 요구되는 어플리케이션들을 위해서 그래픽 라이브러리로 OpenGL ES(Open Graphic Library Embedded System)라는 라이브러리를 기본적으로 지원한다.

OpenGL ES는 Khronos Group(http://www.khronos.org/opengles/)에서

제공하는 Open GL의 임베디드 버전이다. 2D와 3D 데이터를 표현하기 위한 C언어 베이스의 크로스 플랫폼 인터페이스이다. 이 템플릿을 추가하면 기존에 화면(View)을 그리기 위해 사용했던 CoreGraphics.framework 대신에 아래 그림과 같은 2개의 framework이 추가 된다.




역시 아무런 조작이 없이 Xcode 에서 'Build and Run' 버튼으로 동작시켜 보면 아래 그림과 같은 애니메이션 어플리케이션이 실행된다.(박스가 상하로 움직이는 것을 볼 수 있다.)




아래 그림은 Open GL/ES템플릿을 선택했을 경우 프로젝트 화면이다. Navigation 템플릿과달리 여러 가지 리소스들이 포함된 것을 볼 수 있다.





Open GL에 관해서 몇 개의 참조 사이트를 소개하도록 하겠다.

http://developer.apple.com/iphone/library/documentation/3DDrawing/Conceptual/OpenGLES_

ProgrammingGuide/Introduction/Introduction.html

: 이곳은 Apple 에서 공식적으로 제공하는 OpenGL/ES 프로그래밍 가이드를 소개하는 페이지이다. iPhone OS 에서 OpenGL ES를 활용한 프로그램과 프레임 버퍼를 이용하는 방법, Vertex Data, Texture Data 등을 활용하여 만든 예제, 퍼포먼스 가이드라인, Texturetool 을 사용하는 방법들을 설명해 준다.

또한 아래와 같은 사이트를 참조하라고 소개하고 있다. OpenGL ES API Registry(http://www.khronos.org/registry/gles/)

OpenGL ES 2.0 Reference Pages (http://www.khronos.org/opengles/sdk/docs/man/)

OpenGL ES Framework Reference 함수 설명 사이트 (http://developer.apple.com/iphone/library/documentation/OpenGLES/Reference/OpenGLES_

Framework/index.html#//apple_ref/doc/uid/TP40007628

)

iPhone용 OpenGL ES 강좌 사이트(영문; http://web.me.com/smaurice/AppleCoder/iPhone_OpenGL/iPhone_OpenGL.html)

Khoronos group 에서 제공하는 OpenGL ES SDK 메뉴얼 사이트(http://www.khronos.org/opengles/sdk/docs/man/)





C) Tab Bar Application

This template provides a starting point for an application that uses a tabbar. It provides a iser interface configured with a tab bar for the first tab bar item.

Tab Bar를 사용하는 어플을 만드는 곳입니다.

Tab Bar는 Application 뷰의 하단에 위치해서 뷰를 전환하는 역할을 하는 버튼들을 모아놓는 곳이다. Navigation Bar와 유사하다. iPhone OS의 기본프로그램에도 많이 쓰여 지고 있다. 아래 그림은 Tab Bar의 여러 가지 유형의 보여주고 있다.

 





아래 그림은 템플릿을 사용한 프로젝트를 만들고 바로 빌드한 모습니다. 2개의 뷰를 Tab Bar를 사용해서 보여주고 있다.




템플릿을 활용하여 위와 같이 2개의 뷰를 전환하는 예제에서는 각각의 뷰가 필요하다. IB에서 탭이 늘어날 때마다 아래와 같이 Tab Bar Controller Attributes 에서 + 를 클릭한 후 탭과 별도의 뷰를 하나씩 늘려가면 된다.





 


D) Utility Application

This template provides a starting point for a utility application that a main view and a flipside view. It sets up an info button to flip the main view to the flipside, and a navigation bar with a Done item to flip back to the main view.

날씨나 증권같이 위젯 형태의 어플을 만들 수 있는 곳. 단순히 보여주기만 할 뿐, 사용자 입력을 받을 필요가 거의 없는 곳에서 사용하면 적합하다고 하는데 다른 템플보다 이쁘군요.

이 템플릿은 info 버튼이 포함된 Main view와 네비게이션 바를 가진 flipside 형태로 전환되는 뷰를 가진 어플리케이션을 만들때 사용되는 템플릿이다. iPhone 어플리케이션에서 설정 화면등을 구성할 때 자주 사용된다. 아무런 수정도 하지 않고 템플릿을 로드하고 'Build and Run' 했을때 아래와 같은 화면을 볼 수 있다.



이 템플릿은 IB로 디자인하기 위해서 FlipsideView.xib, MainView.xib, MainWindow.xib와 같은 2개의 뷰와 1개의 MainWindow를 가진 리소스를 제공한다. 각각의 View에 해당되는 소스와 ViewController 소스가 템플릿으로 제공되어 진다. 그리고, 이들 뷰간의 동작들을 담당하기 위해서 appDelegate가 역시 템플릿으로 제공된다. (아래 그림참조) 이 템플릿은 MainView에 원하는 Application을 동작시키고 설정 항목등을 FlipsideView에 위치시킬때 사용하면 좋을 것이다.





 

E) View-based Application

This template provides a starting point for an application that uses a single view. It provides a biew controller to manage the view, and a nib file that contains the view.

하나의 뷰가 추가된 어플

이 템플릿은 싱글 뷰를 가진 어플리케이션을 만들 경우 사용되는 템플릿이다. 사실 싱글 뷰로 어플리케이션을 만드는 경우는 거의 없을 것이다. 하지만, 뷰를 조작하기 위한 view controller를 제공해 주고 IB를 위한 간단한 nib 파일을 제공해 준다. 이 템플릿의 장점은 뷰가 많은 Application을 제작할 때 일일이 신경 쓰지 않고도 간단히 원하는 view와 view controller를 가진 UI를 빨리

생성해 주어서 작업능률을 올릴 수 있다는 것이다.






F) Window-based Application

This template provids a starting point for any application. It provides just an application delegate and a window.

가장 기본적인 형태도 뷰도 없다. 따라서 스스로 뷰를 추가하여야 한다.

이 템플릿은 하나의 MainWindow와 AppDelegate 만을 제공해 주는 가장 기본적인 템플릿이다. 개인적으로 IB를 사용하여 UI작업을 할 때 가장 자주 사용하는 템플릿이다. 이 템플릿 위에 뷰와 Object 들을 배치시키고 어플리케이션을 만들 수 있다. 버튼을 누르면 팝업창이 뜨는 간단한 어플리케이션을 예제로 만들어 보겠다.


1) 아래 그림과 같이 MainWindow.xib를 클릭해서 IB를 시작한다.




2) 아래 그림과 같이 IB의 Library 창에서 View Object를 Window 창으로 드래그한다. 그 후에 이 뷰를 메인뷰로 사용할 것이기 때문에 Class명을 myView로 수정한다.






3) 이제 Image View Object와 Round Rect Button Object를 가져와서 그림과 같이 배치한다. Object를 뷰에 올리는 방법은 이전 단계에서 했던 것과 마찬가지로 드래그하면 된다. 그리고, image View Attributes 창에서 aimage.png 라는 그림 파일을 불러온다. 이 그림 파일은 처음에 프로젝트를 만든 후에 Finder로 부터 Project tree로 드래그해서 추가해 놓은 것이다.(필자는 Resources 디렉토리에 두었다.)








4) 이제는 myView에 만들어진 Object들의 IBOutlet을 만들고 event 코드를 작성할 차례이다. IBOutlet은 IB를 사용해서 Object를 포함하는 View를 만들었을 경우 각각의 Object를 control 하기 위해서 만들어 준다.

최종 동작은 '누르세요'라는 버튼을 클릭했을 때 info 베너가 동작하도록 하는 것이다.

IB에서 myView 에 해당되는 소스파일을 프로젝트로 넣기 위해서 저장을 하도록 한다. IB의 메뉴에서 'File | Write Class Files' 를 선택한다. 이 때 myView.h myView.m 파일을 프로젝트에 추가할 것인지를 창이 뜬다. 체크 버튼을 체크해 주고 해당 파일을 프로젝트에 'Add' 해 준다.




5) 프로젝트에 IB에서 만든 UI 소스가 포함되고 나서, 먼저 myView.h 파일의 내용을 아래와 같이 고쳐준다.

#import #import

@interface myView : UIView { IBOutlet UIButton *pBtn; //pBtn을 눌렀을때 showInfo가 동작 IBOutlet UIImage *pImg

} -(IBAction)showInfo;

@end

또, 실제 alert 메시지창을 보여주는 함수 내용은 myView.m에서 작성한다.

#import "myView.h"

@implementation myView -(IBAction)showInfo { UIAlertView *baseAlert = [[UIAlertView alloc] initWithTitle:nil


message:@"showInfo 가 실행되었\n 습니다." delegate:self cancelButtonTitle:nil otherButtonTitles:@"확인",nil];show];release];

}

@end




6) '누르세요' 버튼을 터치다운 했을 경우 showInfo() 라는 함수가 실행되도록 만들기 위해서 IB에서 먼저 해주어야 할일이 있다. 아래 그림처럼 버튼 Object에서 마우스 오른쪽 클릭을 한 후에( 원버튼 마우스의 경우; Ctrl+윈쪽클릭) 'Touch Down' 이벤트를 드래그해서 myView로 가져가면 아래 그림과 같이 showInfo 함수를 선택할 수 있도록 활성화 된다.





7) 이제 저장하고 Xcode에서 빌드하면 showInfo()가 아래 그림과 같이 동작하게 된다. 이런식으로 각각의 Object 들과 터치 이벤트등을 연결할 수 있다.







이상으로 6개의 Project Template를 살펴보았습니다.

그럼 자신이 만들고자 하는 어플과 가장 유사한 템플릿을 선택하여 프로젝트를 시작하면 되겠지요!



출처 : http://blog.naver.com/PostView.nhn?blogId=jforyoum&logNo=60117746694
Posted by 오늘마감
[아이폰 앱 개발] 아이폰 어플 개발 Table View 의 기초

Table View Basics
iPhone tables(UITableView) 의 행(Row)수는 제한이 없음.(iPhone OS Memory)
UITableView - 테이블의 Data를 표시하는 뷰 오브젝트.
UITableViewCell - 테이블의 단일 행을 표현.

UITableViewCell 에 복수의 데이터를 추가하기 위해서
1.UITableViewCell 에 subview 를 추가 하거나
2.UITableViewCell 을 상속하는 서브클래스 작성.

Table > Section > Rows...
그룹 테이블(Figure 8-3)에서 각 Section 은 한 그룹을 나타냄.
인덱스 테이블(Figure 8-3)에서 각 Section 은 한 인덱스의 집합.

Implementing a Simple Table
Writing the Controller

  1. // delegate, datasource protocol 선언.  
  2. // datasource 는 테이블 각 행에 대한 데이터 핸들.  
  3. // delegate 는 데이터의 설정(font, user interation...) 핸들.  
  4. @interface SomeUITableView  {  
  5.     // Table Data.  
  6.     NSArray *tableData;  
  7.     ...  
  8. }  
  9.   
  10. #pragma mark -  
  11. #pragma mark Table View Data Source Methods  
  12. // 해당 Section 에 행 수.  
  13. - (NSInteger)tableView:(UITableView *)tableView  
  14.  numberOfRowsInSection:(NSInteger)section {  
  15.     return [self.tableData count];  
  16. }  
  17.   
  18. // 행이 그려질 때 호출되어 현재 표시될 행의 UITableViewCell 를 리턴.  
  19. // NSIndexPath 를 이용해서 해당 Section[indexPath section]과  
  20. // 해당 행[indexPath row]을 알 수 있음.  
  21. // UITableViewCell 는 캐쉬화 되고 시스템 메모리가 부족할 때 자동 메모리 해제됨.  
  22. - (UITableViewCell *)tableView:(UITableView *)tableView  
  23.          cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
  24.     // cache 할 때 구분자.  
  25.     static NSString *SomeID = @"SomeID";  
  26.   
  27.     // cache 에 저장된 UITableViewCell 취득.  
  28.     UITableViewCell *cell = [tableView   
  29.                              dequeueReusableCellWithIdentifier:SomeID];  
  30.   
  31.     if (cell == nil) {  
  32.         cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero  
  33.                  reuseIdentifier:SomeID] autorelease];  
  34.     }  
  35.     ...  
  36. }  


Adding an Image
UITableViewCell 의 기본 옵션으로 각 행의 왼쪽에 이미지를 붙일 수 있음.
  1. // tableview:cellForRowAtIndexPath:  
  2. ...  
  3. UIImage *image = [UIImage imageNamed:@"someImage.png"];  
  4. cell.image = image;  
  5. ...  


Addtional Configurations
Setting the Indent Level
  1. #pragma mark -  
  2. #pragma mark Table View Delegate Methods  
  3. // 각 행의 indent level(NSInteger) 설정.  
  4. - (NSInteger)tableView:(UITableView *)tableView  
  5. indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath {  
  6.     ...  
  7.     return indentLevel;  
  8. }  


Handling Row Selection
USER 가 선택한 행의 이벤트 전후로 핸들링이 가능.
  1. - (NSIndexPath *)tableView:(UITableView *)tableView  
  2.   willSelectRowAtIndexPath:(NSIndexPath *)indexPath {  
  3.     // USER 선택에 대한 이벤트 전처리.  
  4.     ....  
  5. }  
  6.   
  7. - (NSIndexPath *)tableView:(UITableView *)tableView  
  8.    didSelectRowAtIndexPath:(NSIndexPath *)indexPath {  
  9.     // USER 선택에 대한 이벤트 후처리.  
  10.     ....  
  11. }  


Changing Font Size and Row Height
  1. // tableview:cellForRowAtIndexPath:  
  2. ...  
  3. cell.font = [UIFont boldSystemFontOfSize:80];  
  4. ...  
  5. // 열의 높이 설정.  
  6. - (CGFloat)tableView:(UITableView *)tableView  
  7. heightForRowAtIndexPath:(NSIndexPath *)indexPath {  
  8.     ....  
  9.     return height;  
  10. }  
Posted by 오늘마감
아이폰 개발 ScrollView 를 만드는 손쉬운 방법

* 스크롤뷰를 만들어보겠는데요.

너무 상세한 설명은 개발하는데 오히려 독이 될수 있으니 간략하게 몇가지만 집어드리도록 할께요.

상세한 설명이 없으면 정보가 있어도 바로 쓸수가 없어서 답답하지만

그만큼 많은 정보를 찾아보게 되어 오히려 분석해보고 하는 개발자에게 있어 꼭 필요한 습관이 길러져요.

1. xcode를 실행해서 새로운 프로젝트를 만들어봐요.

   필자는 scrollView로 만들었어요

   XIB파일을 포함해서 만들면 아래와 같이 파일들이 생성되요.

2. 여기서 우선 작업할께 xib 파일인데, scrollViewViewController.xib 파일을 더블클릭하세요.

    그러면 인터페이스 빌더라가 나오는데 라이브러리를 이용해서 아래와 같이 작업을 하세요.

트리구조를 잘 보시고 작업을 해야되요. 스크롤되는 뷰는 스크롤뷰안에 있어야 스크롤이 되니

스크롤를 하실 뷰를 안으로 넣어주시면 되요. 그러면 스크롤뷰안에 없는 뷰들은 스크롤이 안되겠죠? ㅎㅎ

아래그림은 이미지파일을 넣어서 위치를 조정해서 깔끔하게 보여지게 만들었어요.

3. 이제 실제 작동을 위해서 소스에 코딩을 해야되요.

== .h =========================================================

#import

@interface scrollViewViewController : UIViewController {
 
 IBOutlet UIScrollView *scrollView;

}

@property (nonatomic, retain) IBOutlet UIScrollView *scrollView;

@end

== .m ========================================================

#import "scrollViewViewController.h"

@implementation scrollViewViewController

@synthesize scrollView;

-(void) viewDidLoad {
 [super viewDidLoad];
 [scrollView setContentSize:CGSizeMake(320, 460*1.5)];
 //[scrollView setScrollEnabled:YES];
 //[self.view addSubview:scrollView];
}

===========================================================

4. 이제 xib를 다시 열어 연결을 시켜봐요.

   UI와 만들어진 객체가 연결이 되면 비로소 작동을 하게 되요.

   File's Owner를 오른쪽마우스를 클릭 ( 컨트롤키 + 마우스좌클릭 ) 을 하게되면

   검은창이 나오게 되요.

   보시면 아까 선언한 Outlets안에 scrollVie가 보여요. 바로 오른쪽에 보이는 원을 클릭한 채로

   Scroll View에 연결을 하면 되요.

  Scroll View를 보면 연결된걸 보게 되요.

5. 자 이제 실행을 해보면 완성된걸 확인할 수 있어요. ( 단축키 : 커맨드키 + 리턴키 )

  6. 속성

  Scroll View를 클릭해보면 속성창을 볼수가 있어요 (없으면 상단메뉴 tool를 눌러서 실행하세요)

  영어로 되어있지만 해석해보면 무슨 기능을 하는지 대략 짐작이 가실수 있어요.

  하나하나 체크해가면서 적용해보시면 되요.



출처 : http://blog.naver.com/PostList.nhn?blogId=hana_815¤tPage=53
Posted by 오늘마감
아이폰어플 개발, 폰트 설정하는 방법

아이폰 SDK의 UIKit에는 문자열의 출력을 위해 NSString에 추가된 메소드들을 제공합니다. 이를 이용해서 UIView의 drawRect에서 직접 문자열을 출력하는 간단한 방법을 알아 보겠습니다. UIKit에 추가된 NSString의 메소드들에 대한 자세한 설명은 iPhone DevCenter의 NSString UIKit Additions Reference 문서에서 확인하실 수 있습니다.

1. 폰트 설정

폰트는 UIFont를 사용하여 설정할 수 있습니다. iPhone과 터치에서 사용가능한 폰트는 아래의 소스를 이용하여 확인할 수 있습니다.

NSArray* familyArray = [UIFont familyNames];
for (NSString *familyName in familyArray) {
    NSLog(@"- %@", familyName);   
    NSArray *fontArray = [UIFont fontNamesForFamilyName:familyName];
        
    for (NSString *fontName in fontArray) {
        NSLog(@"%@", fontName);
    }   
}

위 소스를 실행하면 아래와 같이 폰트들의 목록이 출력됩니다. 전체목록은 아래의 '모든 폰트 보기'를 클릭하시면 확인하실 수 있습니다.
- Georgia
Georgia-Bold
Georgia
Georgia-BoldItalic
Georgia-Italic

닫기

- Courier
Courier
Courier-BoldOblique
Courier-Oblique
Courier-Bold

- AppleGothic
AppleGothic

- Arial
ArialMT
Arial-BoldMT
Arial-BoldItalicMT
Arial-ItalicMT

- STHeiti TC
STHeitiTC-Light
STHeitiTC-Medium

- Hiragino Kaku Gothic ProN
HiraKakuProN-W6
HiraKakuProN-W3

- Courier New
CourierNewPS-BoldMT
CourierNewPS-ItalicMT
CourierNewPS-BoldItalicMT
CourierNewPSMT

- Zapfino
Zapfino

- Arial Unicode MS
ArialUnicodeMS

- STHeiti SC
STHeitiSC-Medium
STHeitiSC-Light

- American Typewriter
AmericanTypewriter
AmericanTypewriter-Bold

- Helvetica
Helvetica-Oblique
Helvetica-BoldOblique
Helvetica
Helvetica-Bold

- Marker Felt
MarkerFelt-Thin

- Helvetica Neue
HelveticaNeue
HelveticaNeue-Bold

- DB LCD Temp
DBLCDTempBlack

- Verdana
Verdana-Bold
Verdana-BoldItalic
Verdana
Verdana-Italic

- Times New Roman
TimesNewRomanPSMT
TimesNewRomanPS-BoldMT
TimesNewRomanPS-BoldItalicMT
TimesNewRomanPS-ItalicMT

- Georgia
Georgia-Bold
Georgia
Georgia-BoldItalic
Georgia-Italic

- STHeiti J
STHeitiJ-Medium
STHeitiJ-Light

- Arial Rounded MT Bold
ArialRoundedMTBold

- Trebuchet MS
TrebuchetMS-Italic
TrebuchetMS
Trebuchet-BoldItalic
TrebuchetMS-Bold

- STHeiti K
STHeitiK-Medium
STHeitiK-Light

닫기


폰트명을 보면 볼드는 -bold와 이텔릭은 -Italic과 같이 되어 있어 각각의 특징을 알 수 있습니다. 폰트는 일반적으로 UIFont의 아래와 같은 메소드를 사용하여 생성합니다.
+ (UIFont *)fontWithName:(NSString *)fontName size:(CGFloat)fontSize

fontName에는 폰트명을 fontSize에는 크기를 설정하여 UIFont 오브젝트를 생성합니다. 아래는 위의 메소드를 이용하여 19 사이즈의 'Verdana-Bold' 폰트를 생성하는 예입니다.
UIFont *generalFont = [UIFont fontWithName:@"Verdana-Bold" size:19];

한글은 다른 폰트로 설정을 해도 영향을 받지 않는 것 같고 'AppleGothic'만 사용할 수 있는 것 같습니다. 
 

2. 컬러 설정

컬러는 UIColor의 'colorWith...' 류의 생성 메소드로 직접 생성할 수 있지만 아래와 같이 미리 지장된 색상을 간편하게 이용할 수도 있습니다.
UIColor *generalColor = [UIColor darkGrayColor];

UIColor에서 지정되어 있는 색상은 아래와 같습니다.
black, darkGray, lightGray, white, gray, red, green, blue, cyan, yellow, magenta, orange, 
purple, brown

색상설정은 set을 이용하여 간편하게 적용할 수 있습니다. 
[generalColor set]


3. drawAtPoint

지정된 위치에 문자열을 출력하는 간단한 메소드입니다. 반환값은 실제 문자를 출력한 크기입니다.
- (CGSize)drawAtPoint:(CGPoint)point withFont:(UIFont *)font

point에 출력될 위치를 font에 사용될 폰트를 지정합니다.  다소 복잡하지만 아래의 메소드도 많이 사용됩니다.
- (CGSize)drawAtPoint:(CGPoint)point 
forWidth:(CGFloat)width 
withFont:(UIFont *)font 
lineBreakMode:(UILineBreakMode)lineBreakMode

forWith는 문자열이 출력될 너비를 구합니다. fotWidth를 넘어 가는 문자들은 출력되지 않으며, lineBreakMode에 설정된 값에 따라 잘리는 옵션을 선택할 수 있습니다. 옵션은 아래와 같습니다. lineBreakMode의 옵션은 아래와 같습니다.

  • UILineBreakModeWordWrap - 단어 단위
  • UILineBreakModeCharacterWrap - 문자 단위
  • UILineBreakModeClip - 영역
  • UILineBreakModeHeadTruncation - 앞에 '...' 표시
  • UILineBreakModeTailTruncation - 뒤에 '...' 표시
  • UILineBreakModeMiddleTruncation - 중간에 '...' 표시

각 옵션의 결과는 아래의 샘플에서 확인하실 수 있습니다.


4. drawInRect

지정된 영역에 문자를 출력하는 메소드 입니다. 가로정렬이 가능하고 긴 문자열의 경우에는 여러줄에 걸쳐 출력을 할 수 있습니다.
- (CGSize)drawInRect:(CGRect)rect 
withFont:(UIFont *)font 
lineBreakMode:(UILineBreakMode)lineBreakMode 
alignment:(UITextAlignment)alignment

drawAtPoint와 동일하며 alignment의 옵션은 아래와 같습니다.
  • UITextAlignmentLeft - 좌측 정렬
  • UITextAlignmentCenter - 중앙 정렬
  • UITextAlignmentRight - 우측정렬

5. 출력전 크기 구하기 

출력전에 미리 출력될 문자열의 크기를 알아 낼 수 있는 'sizeWith...'류의 메소드들을 제공합니다. 출력시 사용하는 font와 width, lineBreakMode과 동일하게 설정하고 호출하면 출력될 텍스트의 실제 크기를 반환합니다.
- (CGSize)sizeWithFont:(UIFont *)font 
forWidth:(CGFloat)width 
lineBreakMode:(UILineBreakMode)lineBreakMode

drawInRect로 긴 문자열을 여러줄에 출력할 시에는 아래의 메소드를 호출해여 크기를 구해 와야 합니다.
- (CGSize)sizeWithFont:(UIFont *)font 
constrainedToSize:(CGSize)size 
lineBreakMode:(UILineBreakMode)lineBreakMode


6. 샘플

위의 메소드들을 이용해서 아래와 같이 간단한 예제를 만들어 보겠습니다. drawAtPoint의 breakMode별로 출력하고, 마지막에는 drawInRect를 이용하여 여러행에 걸쳐 출력하도록 하였습니다.
UIView 서브클래스의 drawRect에 아래와 같이 소스를 입력합니다.
- (void)drawRect:(CGRect)rect {
// 시작 x 좌표 
#define START_X        10

    /* 텍스트 설정 (from wikipedia) */
    NSString *title = @"Tiger"; 
    NSString *memo = @"The tiger (Panthera tigris) is a member of the Felidae family;" \
                      "the largest of the four big cats";

    /* 폰트 설정 */
    UIFont *titleFont = [UIFont fontWithName:@"Arial-BoldItalicMT" size:40];
    UIFont *memoFont = [UIFont fontWithName:@"ArialMT" size:16];

    /* 칼라 설정 */
    UIColor *blackColor = [UIColor blackColor];
    UIColor *blueColor = [UIColor blueColor];
    UIColor *redColor = [UIColor redColor];
    UIColor *userColor = [UIColor colorWithRed:0.2 green:0.4 blue:0.2 alpha:0.8]; 

    CGFloat yPosition = 10;
    CGFloat viewWidth = [self bounds].size.width;
    CGSize textSize;

    /* 타이틀 출력 */ 
    [blueColor set];
    textSize = [title drawInRect:CGRectMake(0, yPosition, viewWidth, 30)
                        withFont:titleFont 
                   lineBreakMode:UILineBreakModeWordWrap 
                       alignment:UITextAlignmentCenter];
    yPosition = (textSize.height + 20);
        
    int mode = 0;    
    NSArray* breakModeArray = [NSArray arrayWithObjects:@"WordWrap",
                               @"CharacterWrap",
                               @"Clip",
                               @"HeadTruncation",
                               @"TailTruncation",
                               @"MiddleTruncation",
                               nil];

    /* breakMode 설정별로 텍스트 출력 */
    [blackColor set];

    for (NSString *modeName in breakModeArray) {
        /* 현재 breakMode 출력 */
        [redColor set];
        textSize = [modeName drawAtPoint:CGPointMake(START_X, yPosition) 
                                forWidth:viewWidth 
                                withFont:memoFont 
                           lineBreakMode:UILineBreakModeWordWrap];
        yPosition += textSize.height;
        
        /* 텍스트 출력 */
        [blackColor set];
        textSize = [memo drawAtPoint:CGPointMake(START_X, yPosition) 
                            forWidth:viewWidth-80 
                            withFont:memoFont 
                       lineBreakMode:mode];
        yPosition += (textSize.height + 8);
        
        mode++;
    }

    /* drawInRect 타이틀 출력 */
    [redColor set];
    textSize = [@"* drawInRect" drawAtPoint:CGPointMake(START_X, yPosition) 
                                   forWidth:viewWidth 
                                   withFont:memoFont 
                              lineBreakMode:UILineBreakModeWordWrap];
    yPosition += textSize.height;

    /* memo를 drawInRect로 출력 */
    [userColor set];
    textSize = [memo drawInRect:CGRectMake(START_X, yPosition, viewWidth-80, 100) 
                       withFont:memoFont 
                  lineBreakMode:UILineBreakModeWordWrap];
}



출처 : http://blog.naver.com/PostList.nhn?blogId=hana_815¤tPage=31
Posted by 오늘마감
아이폰 어플 개발 Table View 의 기초

Table View Basics
iPhone tables(UITableView) 의 행(Row)수는 제한이 없음.(iPhone OS Memory)
UITableView - 테이블의 Data를 표시하는 뷰 오브젝트.
UITableViewCell - 테이블의 단일 행을 표현.

UITableViewCell 에 복수의 데이터를 추가하기 위해서
1.UITableViewCell 에 subview 를 추가 하거나
2.UITableViewCell 을 상속하는 서브클래스 작성.

Table > Section > Rows...
그룹 테이블(Figure 8-3)에서 각 Section 은 한 그룹을 나타냄.
인덱스 테이블(Figure 8-3)에서 각 Section 은 한 인덱스의 집합.

Implementing a Simple Table
Writing the Controller

  1. // delegate, datasource protocol 선언.
  2. // datasource 는 테이블 각 행에 대한 데이터 핸들.
  3. // delegate 는 데이터의 설정(font, user interation...) 핸들.
  4. @interface SomeUITableView  {  
  5.     // Table Data.
  6.     NSArray *tableData;  
  7.     ...  
  8. }  
  9. #pragma mark -
  10. #pragma mark Table View Data Source Methods
  11. // 해당 Section 에 행 수.
  12. - (NSInteger)tableView:(UITableView *)tableView  
  13.  numberOfRowsInSection:(NSInteger)section {  
  14.     return [self.tableData count];  
  15. }  
  16. // 행이 그려질 때 호출되어 현재 표시될 행의 UITableViewCell 를 리턴.
  17. // NSIndexPath 를 이용해서 해당 Section[indexPath section]과
  18. // 해당 행[indexPath row]을 알 수 있음.
  19. // UITableViewCell 는 캐쉬화 되고 시스템 메모리가 부족할 때 자동 메모리 해제됨.
  20. - (UITableViewCell *)tableView:(UITableView *)tableView  
  21.          cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
  22.     // cache 할 때 구분자.
  23.     static NSString *SomeID = @"SomeID";  
  24.     // cache 에 저장된 UITableViewCell 취득.
  25.     UITableViewCell *cell = [tableView   
  26.                              dequeueReusableCellWithIdentifier:SomeID];  
  27.     if (cell == nil) {  
  28.         cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero  
  29.                  reuseIdentifier:SomeID] autorelease];  
  30.     }  
  31.     ...  
  32. }  


Adding an Image
UITableViewCell 의 기본 옵션으로 각 행의 왼쪽에 이미지를 붙일 수 있음.
  1. // tableview:cellForRowAtIndexPath:
  2. ...  
  3. UIImage *image = [UIImage imageNamed:@"someImage.png"];  
  4. cell.image = image;  
  5. ...  


Addtional Configurations
Setting the Indent Level
  1. #pragma mark -
  2. #pragma mark Table View Delegate Methods
  3. // 각 행의 indent level(NSInteger) 설정.
  4. - (NSInteger)tableView:(UITableView *)tableView  
  5. indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath {  
  6.     ...  
  7.     return indentLevel;  
  8. }  


Handling Row Selection
USER 가 선택한 행의 이벤트 전후로 핸들링이 가능.
  1. - (NSIndexPath *)tableView:(UITableView *)tableView  
  2.   willSelectRowAtIndexPath:(NSIndexPath *)indexPath {  
  3.     // USER 선택에 대한 이벤트 전처리.
  4.     ....  
  5. }  
  6. - (NSIndexPath *)tableView:(UITableView *)tableView  
  7.    didSelectRowAtIndexPath:(NSIndexPath *)indexPath {  
  8.     // USER 선택에 대한 이벤트 후처리.
  9.     ....  
  10. }  


Changing Font Size and Row Height
  1. // tableview:cellForRowAtIndexPath:
  2. ...  
  3. cell.font = [UIFont boldSystemFontOfSize:80];  
  4. ...  
  5. // 열의 높이 설정.
  6. - (CGFloat)tableView:(UITableView *)tableView  
  7. heightForRowAtIndexPath:(NSIndexPath *)indexPath {  
  8.     ....  
  9.     return height;  
  10. }  



출처 : http://blog.naver.com/PostList.nhn?blogId=hana_815¤tPage=91
Posted by 오늘마감
아이폰 어플 개발, 모델, 뷰, 컨트롤러의 생성과 연동하는 방법



모델, 뷰, 컨트롤러의 생성과 연동


1. HelloPoly라는 이름의 iPhone OS application의 “Window-Based Application” 을 생성한다.

2. 유저인터페이스를 배치한다.

3. 컨트롤러를 생성하고 UI element와 연동시킨다.

4. PolygonShape를 import 한후 컨트롤러와 연동시킨다.

5. 유저의 화면 조작에 의해 실행되는 action 메소드를 구현한다.

6. polygon 오브젝트를 초기화 시키는 awakeFromNib를 구현한다.

7. 화면 조작에 의한 결과를 값의 증감, 다각형의 형태에 반영시키도록 한다.
    • 증가 버튼을 누르면 그 결과에 따라 다각형이 변하도록 만든다.

8. 면(number of sides)의 값이 최소 또는 최대값에 다다르면 유저인터페이스의 요소들을 활성화 또는 비활성화 시키도록 한다.
    • 면(number of sides)의 값이 최소에 다다르면 감소 버튼을 비활성화 시킨다.
    • 면(number of sides)의 값이 최대에 다다르면 증가 버튼을 비활성화 시킨다.


<추가 Task>

• 화면에 다각형의 내각과 라디안을 표시하는 텍스트라벨을 추가한다.
• 사용할 수 있는 다각형의 최대, 최소 값 정보를 표시하는 텍스트라벨을 추가한다.
• 다각형 이름을 표시할 수 있는 텍스트라벨을 추가한다.


■ 튜토리얼 원문: HelloPoly Walkthrough

<개요>

코코아 터치 어플리케이션을 만들기 위한 스텝 바이 스텝 튜토리얼로, 과제B를 완성시키기 위한 힌트이다.

결국 만들고자 하는것이 아래 이미지와 같다는것을 염두에 두고 진행한다.
이 컨트롤러 오브젝트에 유저인터페이스 요소들과 연동되는 인스턴스 변수를 선언해야 한다.


새로운 Cocoa Touch 프로젝트를 생성한다:
1. 메뉴의 File > New Project… 를 선택.
2. iPhone OS Application을 선택한 후, Window-Based Application 템플렛을 선택한다.
3. 프로젝트 명을 ‘HelloPoly’로 지정한다.


Active SDK 설정하기

편의를 위해서 여기서는 iPhone Simulator를 사용하도록 한다.
iPhone 어플리케이션을 개발할때 개발자는 어떤 플랫폼을 대상으로 개발할 것인지 Xcode에서 설정해주어야 하는데
이 Active SDK를 변경하기 위해서는 메뉴의 Project > Set Active SDK에서 ‘Simulator - iPhone OS 2.0’를 선택한다.

이와 관련하여 편리한 ‘Overview’ 라는 툴바 팝업이 있다.
이것은 Active SDK 와 Build Configuration(주로 debug또는 release)을 동시에 설정하도록 해준다.
메뉴의 View > Customize Toolbar... 를 선택한후 툴바에 이 팝업을 추가하면
iPhone 어플리케이션을 개발하면서 SDK를 전환할때 편리하게 쓸수 있다.


중간점검: 빌드(Build) 와 테스트
이 프로젝트는 이미 Cocoa Touch application의 골격(skeleton)을 사용하여 만들어졌다.
툴바의 “Build and Go”를 눌러 어플리케이션이 시뮬레이터로 기동되는지 확인해보자.
여기서 사용하고 있는 템플렛은 가장 기본이 되는 공백뷰(empty view)만 있는 템플렛으로 나머지는 직접 추가해야 한다.
처음부터 컨트롤을 배치해주는 다른 템플렛들도 있는데 이것은 필요에 따라 다른 과제에서 사용해보도록 한다.


Interface Builder 사용하기
위에서 확인해본 공백뷰(empty view)는 MainWindow.xib 파일에 정의되어 있다.
xib(“interface file” 또는 “nib file” 이라고 불리운다) 파일은 인터페이스 빌더에서 설정/연결된 오브젝트 정보를 포함한다.
Xcode 프로젝트 템플렛은 일반적으로 실행시 “MainWindow.xib”라는 파일을 부르도록 설정되어 있으며
이 인터페이스 파일은 어플리케이션의 메인위도우나 다른 유저 인터페이스를 포함한다.
디자인 화면에서 xib 파일을 저장하면 오브젝트의 상태들이 이 파일에 저장된다.
런타임 환경에서는 xib파일이 로딩되어 저장되어 있던 오브젝트의 상태들이 다시 실제 오브젝트에 반영된다.
MainWindow.xib를 더블클릭하면 인터페이스 빌더가 기동될 것이다.
(인터페이스 빌더는 /Developer/Applications 에 있다.)


Tip: 인터페이스 빌더의 메뉴에서 (편의를 위해) 인터페이스 빌더 외의 다른 툴들은 숨기도록 설정 할수 있다.


인터페이스 빌더를 이용하여 아래 4가지 작업을 한다:

<순서>
1. 유저 인터페이스를 배치하고 설정한다.
2. 컨트롤러 클래스를 정의하고 인스턴스화 한다.
3. 유저 인터페이스와 컨트롤러를 연결한다.
4. 새로운 컨트롤러 클래스를 위해 소스 파일을 생성한다.

1. 유저 인터페이스를 배치하고 설정한다. +-----+-----+-----+-----+-----+

아래와 같은 유저 인터페이스를 만든다:


Library 윈도우는 윈도우에 드래그하여 배치할 수 있는 많은 오브젝트를 제공한다.
여기에는 미디어 리소스(이미지, 사운드등)에 억세스할수 있는 오브젝트도 있다.


1. Cocoa Touch Plugin아래 있는 오브젝트를 선택한다.
2. 두개의 push 버튼을 윈도우에 추가한다.
3. 두개의 텍스트 라벨을 윈도우에 추가한다.
하나는 왼쪽에 배치하여 “Number of sides”라고 표시하고 나머지 하나는 오른쪽에 배치하여 값을 표시한다.


Attributes Inspector:

메뉴의 Tools > Attributes Inspector 를 선택하면 석택한 아이템의 속성값을 표시할 수 있다.


라벨의 타이틀을 편집하려면 Attributes Inspector에서 Text값을 편집하던가 라벨을 더블클릭하여 직접 바꿀수 있다.

1. Attributes Inspector가 화면에 없다면 Tools > Attributes Inspector 을 선택하여 표시하도록 한다.
2. 화면에 배치한 텍스트 라벨을 선택한다.
3. 왼쪽 라벨에 “Number of sides:” 라고 표시한다.
4. 오른쪽 라벨은 “5”라고 표시한다 (여기서 사용할 디폴트 값)
5. 버튼의 표시 텍스트(title)를 바꾸기 위해 버튼을 더블클릭한다.
6. 왼쪽 버튼은 “Decrease”로 표시한다.
7. 오른쪽 버튼은 “Increase”로 표시한다.

2. 컨트롤러 클래스를 정의하고 인스턴스화 한다. +-----+-----+-----+-----+-----+

■ 컨트롤러 클래스를 정의해보자

컨트롤러 클래스는 화면의 두 버튼과 값을 표시할 텍스트 라벨의 참조를 위한 인스턴스 변수를 가진다.
이 참조는 outlet(콘센트) 이라고도 한다. 또한 버튼에 대한 액션 메소드도 만들어야 한다.


1. 라이브러리의 Cocoa Touch Plugin 아래에 있는 Controllers 그룹을 선택한다.
2. Object 아이템을 선택한다. 이 아이콘은 유저가 정의한 유저정의 오브젝트를 의미한다.


3. 오브젝트 아이콘을 인터페이스 도큐먼트 윈도우로 드래그한다.
4. 도큐먼트 윈도우의 Object 아이템을 선택한다.
5. 메뉴의 Tools > Identity Inspector 를 이용하여 인스펙터 윈도우를 표시한다.
6. Class 필드에 Controller 라고 입력한다. 도큐먼트 윈도우의 이름이 업데이트 된것을 확인한다.


또한 클래스에 outlet(콘센트)이나 액션을 추가하기 위해서는 Identity Inspector 를 이용한다.

outlet(콘센트)을 유저정의 클래스에 추가하는 방법은:
1. 컨트롤러 오브젝트를 선택한 상태로
2. Class Outlets 섹션에 아래와 같은 outlet과 type을 정의한다.

Outlet Type
numberOfSidesLabel UILabel
decreaseButton UIButton
increaseButton UIButton

3. Class Actions 섹션에는 두가지 액션을 추가한다. 처음 액션을 ‘increase’ 로 세팅하고 두번째를 ‘decrease‘로 세팅한다.


인스펙터는 다음과 같아질 것이다:

3. 유저 인터페이스와 컨트롤러를 연결한다. +-----+-----+-----+-----+-----+

컨트롤러 클래스의 정의가 끝났음으로 인터페이스 파일내에 인스턴스가 존재한다.
이제 유저 인터페이스와 컨트롤러의 연결을 설정해보자.


Outlet(콘센트)과 연결하기


우선 outlet과 연결해보자. outlet 은 오브젝트간의 참조라고 할수 있다.


컨트롤러에서 텍스트 라벨로의 연결을 설정하기 위해서는:
1. 도큐먼트 윈도우 안의 컨트롤러를 선택한다.
2. 메뉴의 Tools > Connections Inspector 을 이용하여 적절한 인스펙터를 표시한다.
Connections Inspector(연결 인스펙터)에는 모든 사용가능한 outlet과 액션이 선택되어져 있을 것이다.

3. outlet과 action들 옆에는 동그란 모양의 “connection circle” 이 있는데 이것을 ‘numberOfSidesLabel’ outlet 옆의
텍스트 라벨에 끌어온다. 여기서는 타입이 맞는 outlet과 object만 연결가능하다.(여기서는 UILabel)

4. 연결하고자 하는 곳의 끌어왔을때 선택가능한 부분이 반전될것인데 그때 마우스 버튼을 놓으면 된다.

5. 인스펙터는 연결이 확립되었을때 아래와같이 표현된다. 나머지 outlet에 대해서도 같은 작업을 반복한다.


런타임 환경에서 컨트롤러 오브젝트는 이 컨트롤에 대한 참조를 가지게 될 것이며 메세지를 전달(호출/실행)할수 있게 된다.


변경을 저장한다.


■ 버튼의 타켓과 액션을 설정한다


모든 컨트롤은 오브젝트에 대한 참조를 가질수 있는데 이것을 타켓이라고 부른다.
그리고 타켓에서 불리는 메소드를 액션이라고 부른다.
어플리케이션이 실행되면서 특정 이벤트가 발생할때 컨트롤은 타켓의 액션을 실행한다.
이 어플리케이션에서는 버튼을 컨트롤러에 연결시키고 버튼이 클릭되었을때 증가/감소 메소드가 실행되도록 해보자.


컨트롤의 연결을 확립시키는 방법은 바로 위에서 outlet을 설정한 방법과 매우 비슷하다.


1. Increase 버튼을 선택한다.
2. Connections Inspector 가 없다면 메뉴의 Tools > Connections Inspector 를 실행시켜 보이게 한다.
3. 인스펙터에는 컨트롤을 지원하는 이벤트 리스트가 보이는데 해당 동그라미를 클릭하여 드래그 할 수 있다.
여기서는 “Touch Up Inside”(컨트롤의 안쪽을 터치했다 떼었을때) 이벤트를 사용한다.
Touch Up Inside이벤트 오른쪽의 동그라미를 끌어다가 컨트롤 오브젝트에 연결한다. 여기까지가 타켓을 설정하는 방법이다.


4. 위에서 끌어다가 오브젝트에 연결시키기 위해 마우스 버튼에서 손을 떼면(release) 타겟에서 실행할 수 있는
액션 메소드가 팝업으로 표시된다. 여기서는 두가지 액션 메소드가 보일 것이다. increase 메소드를 선택한다.


이 부분이 액션을 설정하는 부분이다.
5. Decrease 버튼에 대한 타켓과 액션도 같은 방법으로 설정한다.


변경을 저장한다.


4. 새로운 컨트롤러 클래스를 위해 소스 파일을 생성한다. +-----+-----+-----+-----+-----+

Interface Builder안에 컨트롤러 클래스를 정의했지만 실제로 생성하는 Objective-c소스 코드를 적지 않았기때문에
이 단계에서 컴파일&실행을 하려고 하면 에러가 날 것이다.
왜냐하면 nib파일이 로딩 되었을때 컨트롤러 오브젝트가 생성 되어야 하는데 코드가 존재 하지 않기 때문이다.
시험삼아 실행해 보면 아래와 같은 에러를 볼 수 있을 것이다.
“Unknown class Controller in Interface Builder file.“


컨트롤러 클래스를 위한 소스를 적어주기 위해서는:
1. document window에서 Controller 오브젝트를 선택한다.
2. 메뉴의 File > Write Class Files... 를 선택한다.
3. Save 파넬이 나타날 것이다. 여기서 헤어파일도 같이 생성된다. 디폴트 세팅으로 저장한다.
4. 새로 만들 파일을 프로젝트에 추가할 것인지 묻는 다이얼로그가 나온다.
다이어로그에는 프로젝트에 정의된 모든 타겟이 나오는데 여기서는 HelloPoly밖에 존재 하지 않음으로 하나만 나온다.
HelloPoly를 선택하고 Add 버튼을 누른다.

Xcode로 전환되며 새로 만들어진 파일을 편집할 수 있게 된다.

nib파일의 모든 변경을 저장한다.

여기까지가 인터페이스 정의이다.

컨트롤러 클래스 살펴보기

Xcode로 돌아간다.
Controller.h 와 Controller.m가 프로젝트에 추가된 것을 확인 할 수 있다.

헤더 파일을 더블클릭하여 살펴보자.

Controller.h 파일은 다음과 같을 것이다:
#import
#import
@interface Controller : /* Specify a superclass (eg: NSObject or NSView) */
{
IBOutlet UIButton *decreaseButton;
IBOutlet UIButton *increaseButton;
IBOutlet UILabel *numberOfSidesLabel;
}
- (IBAction)decrease;
- (IBAction)increase;
@end


Objective-C는 C, C++, Java를 경험한 사람에게도 좀 특이하게 느껴질수 있다.
이전 강의를 통해 이것이 유저정의 클래스라는것을 알수 있지만 인터페이스 빌더로 부터 만들었기때문에
여기서는 아직 어떤 클래스를 계승받았는지 확정되어있지 않다.
슈퍼 클래스로서 NSObject를 지정하자.
@interface Controller : NSObject {


여기서 또한 우리가 지정한 outlet도 볼수 있는데 이는 인스턴스 변수로서 지정되어 있다. (UIButton * - 버튼에 대한 포인터)
런타임 실행시에 nib 파일이 로딩될 때 이 인스턴스 변수들은 우리가 인터페이스 빌더에서 설정한 연결에 따라 필요한 값을 갖게 된다.
즉, 오브젝트에게 메세지를 전달 할 수 있다는 뜻이다.

그러면 IBOutlet 키워드는 무슨 뜻일까.
IBOutlet 는 단순히 Interface Builder에게 주는 힌트이다.
이 인스턴스 변수들이 IB의 Connections Inspector에 표시 되어야 한다는 뜻이다.
이것은 컴파일 시에는 아무 의미 없는 키워드이다. (#defined를 살펴보면 아무것도 정의되어 있지 않다.)

여기에 increase 와 decrease 메소드도 정의되어 있는데 이것 또한 IBOutlet과 비슷한 IBAction 키워드가 사용된다.
이것은 이 메소드가 IB에서 target-action 연결을 설정할때 action메소드로서 표시되어야 한다는 뜻이다.
void의 동의어이다. Xcode에서 IBOutlet이나 IBAction을 더블클릭해보면 정의를 볼 수 있다.


다음은 Controller.m 을 열어보자:


Tip: 헤더파일과 implementation 파일사이를 점프할때는 오른쪽위의 아래와 같은 버튼(Go To Counterparts)을
누르면 번갈아가며 이동할 수 있다.
또한 메뉴의 Xcode > Preferences… > General > Open counterparts 를 이용하여 각기 다른 에이터 창이 아닌
하나의 에디터 창에서 번갈아가며 표시되도록 설정할 수 있다.


#import "Controller.h"
@implementation Controller
- (IBAction)decrease {
}
- (IBAction)increase {
}
@end


.m 파일에는  increase/decrease 액션 메소드에 대한 stub가 포함되어 있다.
인터페이스 빌더에서 버튼의 타겟으로 컨트롤러 오브젝트를 설정하였고 액션으로 이 메소드들이 설정되었다.
버튼이 클릭되었을때는 컨트롤러 오브젝트의 메소드가 실행 될 것이다.


중간점검: 로그, 빌드와 테스트

increase/decrease 메소드를 구현하기 전에 중간점검을 해보자.
각 메소드에 간단한 로깅을 적어 실행해본다.
NSLog(@“I’m in the increase method”);


버튼을 누르고 제대로 찍히는지 Run > Console에서 확인해 보자.

만약 여기서 제대로 동작하지 않는다면 인터페이스빌더의 target/action설정을 확인해 보도록 하라. (제일 틀리기 쉬운곳)


MVC모델의 M 구현하기

여기까지 우리는 MVC모델의 V와 C를 구현해 왔다. V는 인터페이스 빌더에서 만든 유저 인터페이스 였으며
C는 nib 파일에 정의된 컨트롤러 오브젝트이다.
컨트롤러는 outlet과 target/action을 통하여 뷰와 연결되어 졌다.
하지만 polygon은 어디에 위치해야 할까?
이것이 우리의 Model 부분이다. (M)

저번 과제에서 만든 Polygon 클래스를 사용한다.


Polygon 클래스를 Xcode 프로젝트에 추가한다:

1. Xcode의 메뉴에서 Project > Add to Project...를 선택한다.
2. Open 판넬에서 PolygonShape.h와 .m를 찾아 Shift키로 함께 선택한후 Add를 누른다.
3. 다음 창에서는 “Copy items into destination group’s folder (if needed)”를 체크하여 선택한 소스를 현재 프로젝트로 카피한다.


만약 체크하지 않는다면 외부 소스를 참조하기때문에 프로젝트를 이동하였을때 에러날 가능성이 있다.

여기서 polygon 오브젝트는 모델로 사용되기 때문에 다각형의 실제 정보를 담고 있다.
위에서 만든 컨트롤러는 유저 인터페이스를 업데이트 하기 위해 이 정보에 억세스 할수 있어야 하여
그러기 위하여 우리는 컨트롤러와 모델 사이의 연결을 확립시켜줘야 한다. 이부분이 다음 Task이다.


컨트롤러와 모델 사이의 연결 만들기

이 작업은 위에서 한 작업과 비슷하기 때문에 간단하게 순서만 나열해 보기로 한다.

1. Controller 클래스에 PolygonShape 타입의 인스턴스 변수를 선언한다.
(Controller.h 파일에 PolygonShape.h를 import해야 한다.)
인터페이스 빌더의 connections inspector에 나타나게 하기 위해서는 다른 인스턴스 변수들처럼 IBOutlet 키워드를 사용하여야 한다.

주의: IB를 기동하기 전에 Controller.h를 저장하지 않으면 connections inspector에 나타나지 않는다.

2. 새로운 유저정의 Object를 도큐먼트 윈도우에 추가한다. 클래스 명은 PolygonShape라고 준다.
(힌트: 이 과정은 Controller 클래스를 만든 방법과 동일하다.)

3. IB의 connections inspector 를 이용하여 PolygonShape 인스턴스와 Controller 인스턴스를 연결한다.


(힌트: connections inspector에 polygon outlet이 나타나있지 않는다면 Controller.h를 저장했는지 다시한번 확인해보라.)

4. nib파일을 저장한다.

중간점검: 빌드하고 실행하기

많은 작업을 해 왔기 때문에 여기서 이상이 없나 실행해본다.
이제 초기상태 설정과 increase/decrease 메소드를 구현하는 과정만 남았다.


초기상태 설정하기

초기상태를 설정하기 위해서는 polygon (다각형)의 최대값, 최소값, number of sides를 정하여 한다.
nib에서 자동 생성된 Controller와 Polygon 인스턴스에 값을 지정하기 위해서는 언제가 가장 좋은 시기인가.
우리는 두 오브젝트가 초기화 되고 Controller와 polygon의 연결이 성립된 타이밍을 알아야 하는데,
Cocoa Touch에서는 이 타이밍에 awakeFromNib라는 메소드가 불리도록 준비되어 있다.
nib의 모든 설정이 로딩되고 연결이 확립되면 각 오브젝트들의 awakeFromNib이라는 메소드가 호출된다.
유저정의 클래스에서 이 메소드를 구현하고 싶다면 여기에 원하는 작업을 아무거나 적어주면 된다.
이번 과제에서는 polygon 오브젝트의 최대/최소/number of sides를 적어줄 것이다.

awakeFromNib 메소드는 다음과 같이 적어주면 된다.

- (void)awakeFromNib {
// 여기에 polygon(다각형)을 정의한다.
}


최소/최대 값을 각가 3/12로 설정한다.
numberOfSides 를 설정하기 위해서는 UI의 text 라벨 값을 가져와야 한다.
awakeFromNib이 불리울때는 이미 모든 UI 요소들이 outlet으로 세팅 되어 있기 때문에 아래와 같은 소스로 불러올수 있다.
numberOfSidesLabel.text.integerValue


중간점검: Build and Run

중간 확인을 위해 awakeFromNib 메소드에서 polygon 오브젝트를 로그출력하여 number of sides값을 확인한다.
NSLog (@”My polygon: %@”, polygon);

Error: Cocoa/Cocoa.h No such file or directory. 라는 에러가 난다.

이유는 다른 프로젝트에서 카피해온 PolygonShape.h 에서 Cocoa.h를 import하고 있기 때문에.

저번 과제에서 잘 움직였는데 왜 여기서는?? 이라고 생각하며 검색해보니...

아이폰 어플리케이션에서는 cocoa.h를 import하지 않는다고 나온다.

cocoa.h의 import문을 빼고 컴파일하니 잘 된다. 이유는 나중에 나오겠지..


Action 메소드 구현

마지막 스텝은 increase/decrease 메소드를 구현하는 부분이다.
각 액션 메소드는 아래와 같은 방법으로 구현되어야 한다:

1. polygon의 number of sides를 가져온다.
2. number를 증가/감소 시킨다.
3. polygon에 증감시킨 새로운 number를 설정한다.
4. 새로운 상태를 유저 인터페이스에 적용한다.

4의 유저 인터페이스에 적용시키는 과정은 증/감 모두 같은 순서가 필요하다.
1. number of sides가 최소값에 다달았느냐 아니냐에 따라 decrease버튼을 비활성화 또는 활성화 시킨다.
2. number of sides가 최대값에 다달았느냐 아니냐에 따라 increase버튼을 비활성화 또는 활성화 시킨다.
3. number of sides의 현재 값을 text 라벨에 세팅한다.


이 부분은 여러 메소드에서 불리울수 있어야 하므로 아래와 같은 공통 메소드로 정의한다.

- (void)updateInterface {
// set interface state here
}


UI를 업데이트 하기 위한 힌트
• UIButton 을 활성화/비활성화 시키기 위해서는 “enabled” 속성을 사용하면 된다.
예: 버튼의 비 활성화
someButton.enabled = NO;

•“text” 속성을 이용하여 UILabel 값을 변경할 수 있다.
예: text 라벨에 숫자로 표시되는 문자값 표시하기.
someLabel.text = [NSString stringWithFormat:@”%d”, someNumber];

• UI의 초기상태를 설정하기 위하여 awakeFromNib에서도 같은 메소드를 사용하면 된다.


Build and Test
제대로 다 설정이 되었다면 시뮬레이터로 실행했을때 버튼을 눌러도 최소 3까지만 내려가고 최대 12까지만 올라갈 것이다.


Building for an iPhone or iPod touch
시뮬레이터에서 문제없이 돌아간다면 이제 실제 iPhone이나 iPod touch를 이용해본다.
개발자 프로그램에 등록되어 있다면(유료) Active SDK를 Device로 변경함으로써 간단히 인스톨/실행이 가능해진다.


디자인 리뷰

자, 우리는 MVC모델로 깔끔하게 디자인된 "진짜" iPhone 어플리케이션을 완성했다.
이 어플리케이션의 아키텍쳐와 지금까지 나온 용어들이 여기에 어떻게 들어맞는지 보기 위해 아래 다이어로그를 살펴본다.


완성된 Controller.m 소스

#import "Controller.h"

@implementation Controller

- (IBAction)decrease {

    NSLog(@"decrease method");

polygonObject.numberOfSides -= 1;

[selfupdateInterface];

}

- (IBAction)increase {

    NSLog(@"increase method");

    polygonObject.numberOfSides += 1;

[selfupdateInterface];

}

-(void)awakeFromNib {

polygonObject = [[PolygonShapealloc] initWithNumberOfSides:numberOfSidesLabel.text.integerValue minimumNumberOfSides:3maximumNumberOfSides:12];

NSLog(@"My polygon is: %@", polygonObject);

}

-(void) updateInterface {

if ([polygonObjectnumberOfSides] == [polygonObjectminimumNumberOfSides]) {

decreaseButton.enabled = NO;

} else {

decreaseButton.enabled = YES;

}

if ([polygonObjectnumberOfSides] == [polygonObjectmaximumNumberOfSides]) {

increaseButton.enabled = NO;

} else {

increaseButton.enabled = YES;

}

numberOfSidesLabel.text = [NSStringstringWithFormat:@"%d",[polygonObject numberOfSides]];

}

@end




출처 : http://blog.naver.com/PostView.nhn?blogId=katchup00&logNo=10076311904
Posted by 오늘마감
아이폰 어플 개발 , Selector 의 이용과 클래스 정보 보는 방법


지금까지 만들어봤던 NSString, NSURL, NSProcessInfo, NSDictionary 등과 NSMutableString을 인스턴스화해서
배열(NSMutableArray)에 넣어라.


그리고 아래를 수행하라.


1. 오브젝트의 클래스명을 출력하라
2. 오브젝트가 NSString 클래스인지 출력하라
3. 오브젝트가 NSString의 서브클래스인지 출력하라
4. 오브젝트가 "lowercaseString"를 지원하는지 출력하라
5. "lowercaseString"를 지원하는 오브젝트라면 performSelector:를 이용하여 결과를 출력하라


<예상하는 결과 형식>

2008-01-10 20:56:03 WhatATool[360] Class name: NSCFString
2008-01-10 20:56:03 WhatATool[360] Is Member of NSString: NO
2008-01-10 20:56:03 WhatATool[360] Is Kind of NSString: YES
2008-01-10 20:56:03 WhatATool[360] Responds to lowercaseString: YES
2008-01-10 20:56:03 WhatATool[360] lowercaseString is: hello world!
2008-01-10 20:56:03 WhatATool[360] ======================================
2008-01-10 20:56:03 WhatATool[360] Class name: NSURL
2008-01-10 20:56:03 WhatATool[360] Is Member of NSString: NO
2008-01-10 20:56:03 WhatATool[360] Is Kind of NSString: NO
2008-01-10 20:56:03 WhatATool[360] Responds to lowercaseString: NO
2008-01-10 20:56:03 WhatATool[360] ======================================
2008-01-10 20:56:03 WhatATool[360] Class name: NSCFDictionary
2008-01-10 20:56:03 WhatATool[360] Is Member of NSString: NO
2008-01-10 20:56:03 WhatATool[360] Is Kind of NSString: NO
2008-01-10 20:56:03 WhatATool[360] Responds to lowercaseString: NO
2008-01-10 20:56:03 WhatATool[360] ======================================


<힌트>
아마도 NSString과 같은 클래스 명이 예상치 않은 결과가 나올수 있지만
그건 implementation의 문제이니 여기선 그냥 넘어가도록 한다.


<실습>
NSString, NSURL, NSProcessInfo, NSDictionary, NSMutableString을 만든다.


NSString *myString = @"Hello World!";
NSURL *myURL = [NSURL URLWithString:@"
http://www.stanford.edu"];
NSProcessInfo *myProcess = [NSProcessInfo processInfo];
NSDictionary *myDictionary = [NSDictionary dictionary];
NSMutableString *myMutableString = @"This is a mutable string object";


NSMutableArray를 만들고 위의 오브젝트들을 추가한다.


NSMutableArray *array = [NSMutableArray array];
[array addObject:myString];
[array addObject:myURL];
[array addObject:myProcess];
[array addObject:myDictionary];
[array addObject:myMutableString];


루프를 돌며 클래스 정보를 출력한다.


■ 오브젝트의 클래스명을 출력하라


모든 오브젝트는 NSObject를 계승하니까... NSObject reference를 찾아보자.

- (NSString *)description 이라고 하니까, 클래스 설명이 나와버린다.

구글 검색을 해보니까 className을 쓰면 된다고 한다.

[obj className];

왜 NSObject의 리퍼런스에 나와있지 않은지 모르겠지만 아마도 다른 연관이 있는듯. 일단 나오니까 스킵.


 오브젝트가 NSString 클래스인지 출력하라
- (BOOL)isMemberOfClass:(Class)aClass 이용


오브젝트가 NSString의 서브클래스인지 출력하라
- (BOOL)isKindOfClass:(Class)aClass 이용


오브젝트가 "lowercaseString"를 지원하는지 출력하라
- (BOOL)respondsToSelector:(SEL)aSelector 이용


"lowercaseString"를 지원하는 오브젝트라면 performSelector:를 이용하여 결과를 출력하라
- (id)performSelector:(SEL)aSelector 이용

Selector 란 컴파일된 오브젝트의 메소드를 가르키는 이름이라고 한다.

즉, performSelector: 같은 메소드에 Selector를 지정함으로써 실행할수 있다는 뜻이다.

<결과>

성공!!!



출처 : http://blog.naver.com/PostView.nhn?blogId=katchup00&logNo=10075791909
Posted by 오늘마감