본문 바로가기
조회 수 7997 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print Files
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print Files

Chapter 2 Let’s Get Started


** 2장에서는 아래와 같은 작업을 진행한다


1. Create a new project.

2. Lay out an interface.

3. Create custom classes.

4. Connect the interface to your custom class or classes.

5. Add code to the custom classes.

6. Compile.

7. Test.


** In Xcode


- 프로젝트 생성하기


01.png 


02.png 


03.png 


04.png


- 생성된 프로젝트 폴더 구조


$ cd Random

$ ls -al

total 0

drwxr-xr-x   5 test  staff  170 Feb  4 22:25 .

drwxr-xr-x   5 test  staff  170 Feb  4 22:25 ..

drwxr-xr-x  13 test  staff  442 Feb  4 22:26 .git

drwxr-xr-x   8 test  staff  272 Feb  4 22:25 Random

drwxr-xr-x   5 test  staff  170 Feb  4 22:25 Random.xcodeproj



** The main Function


- Supporting Files 확장하고 main.m 선택

05.png


- main.m은 거의 건들지 않는다. 기본 main() 단순히 NSApplicationMain()호출하며, NSApplicationMain()는 app을 구성하는 객체를 main NIB에서 로드하고 실행한다.



** In Interface Builder


- Random 아래 project navigator 에서 MainMenu.xib 클릭하여 Interface Builder에서 오픈한다.

- Interface Builder 구성

06.png


- Interface Builder 에서 유저 인터페이스 객체(윈도우, 버튼 등등)를 생성하고 설정한다

- 또한 사용자정의 클래스의 인스턴스를 만들고 해당 인스턴스와 유저 인터페이스 객체를 연결한다

- 사용자는 인터페이스 객체와 상호작용할 때 그 객체간의 연결 및 사용자정의 클래스는 코드를 실행시킨다.

- Interface Builder는 객체와 그 연결들을 XIB (발음은 "zib") 파일에 저장한다



** The Utility Area


- 오른쪽 영역에서는 두 패널이 있는데 Inspector와 the Library이다.

- Inspector panel (상단): 현재 선택된 파일 또는 IB 객체의 설정을 포함

- Library (하단): 파일 템플, 스니팻, 객체 및 프로젝트에 사용되는 미디어등을 포함



** The Blank Window


- 윈도우 아이콘을 클릭하여 나오는 빈 윈도우는 NSWindow 클래스의 인스턴스이며 이 또한 XIB 파일에 있다.

- 객체를 윈도우안에 드랍함으로써 그 객체들은 XIB 파일에 추가된다. 객체를 생성하고 설정한 후 XIB 파일에 저장하면 파일 안의 객체들이 "freeze-drying" (or archiving) 된다고 한다.

- Random app이 실행되면, NSRunApplication()가 우리가 생성하고 XIB에 저장된 객체들을 unarchive한 후 사용가능하게 만든다.

- app이 객체들을 로드한 후 사용자가 액션을 취할 때 까지 기다린다. 액션이 취해지면 코드가 자동으로 호출된다.


<참고>

- XIB 파일은 인터페이스 객체와 그 연결들을 표현하는 XML 파일이다

- app이 실행되면 이 XIB 파일은 NIB 파일로 컴파일된다.

- XIB 파일은 소스작업을 하기가 쉽고, NIB 파일은 작고 파싱하기 쉽다. 이런 이유로 app 전달에 NIB 파일이 사용된다. 일반적으로 XIB 파일에서만 작업하고 app은 NIB 파일만 사용할 것이다. 하지만 대부분의 개발자는 XIB와 NIB 모두 사용한다.



** Lay Out the Interface


- 우측 하단의 Library window에서 버튼을 빈 윈도우로 드래드 앤 드랍. 

- 추가 버튼 및 text 필드도 동일하게 빈 윈도우로 추가한다.

07.png 08.png


- 우측 상단의 Attributes Inspector 사용해 윈도우 내부에 있는 각 객체를 정렬

09.png



** The Dock


- XIB 파일에서 버튼같은 객체는 보이는 객체이고 커스텀 제어 객체같은 것은 보이지 않는 객체이다. 우리는 이 보이지 않는 객체를 나타내는 아이콘을 dock에서 볼 수 있다.

- Dock은 메인메뉴, 윈도우을 표현하는 아이콘을 포함한다.

- 이 app의 XIB에서 파일 소유자는 NSApplication 객체이다. NSApplication 객체는 event queue에서 event를 가져와 적당한 윈도우로 포워딩해준다. 파일 소유자에 대해서는 12장에서 다룬다.

30.png



** Create a Class


- 클래스 생성: File->New->New File... menu item to create a new Cocoa -> Objective-C class

- 클래스 이름은 RandomController 이고 수퍼클래스는 NSObject로 한다.

10.png 11.png 12.png 13.png


- RandomController.h 에서는 인스턴스변수와 메소드를 추가한다.

- 이 인스턴스 변수들은 outlet이라 불리는 다른 객체들을 참조하는 포인터들이다. (instance variable = outlet)

- 사용자 인터페이스 객체에 의해 발동되는 메소드들은 action 이라 부른다 (method = action)

#import <Foundation/Foundation.h>
@interface RandomController : NSObject { 
	IBOutlet NSTextField *textField; // IB에서 text field와 연결
}
	- (IBAction)seed:(id)sender; // IB에서 seed button과 연결
	- (IBAction)generate:(id)sender; // IB에서 generate button과 연결
@end

- What can an Objective-C programmer tell from this file?

1. RandomController is a subclass of NSObject.

2. RandomController has one instance variable: textField is a pointer to an instance of the class NSTextField. 

3. RandomController has two methods: seed: and generate: are action methods.


** Create an Instance


- XIB 파일에서 RandomController 클래스의 인스턴스를 생성한다.

- MainMenu.xib 선택하여 IB로 돌아간 후 Library 패널에서 Object & Controllers 선택

- Object를 드래드 앤 드랍


14.png 15.png


- Identity Inspector에서 클래스를 RandomController로 설정한다. Connections Inspector에서 action과 outlet이 나타남


16.png 17.png



** Make Connections

- A lot of object-oriented programming has to do with which objects need to know about which other objects. Now you are going to introduce some objects to each other.

- Cocoa programmers would say, “We are now going to set the outlets of our objects.”

- To introduce one object to another, you will Control- drag from the object that needs to know to the object it needs to know about.


<객체 다이아그램> - 어느 객체가 연결되어야 하는지 보여준다

18.png


- 여기서는 윈도우상에서 RandomController 클래스의 textField 인스턴스 변수를 NSTextField 겍체로 포인팅한다.

- RandomController를 나타내는 아이콘에서 오른쪽 버튼을 클릭하면 connection 패널이 나온다. 여기서 textField 옆에 있는 원을 Label로 끌어넣는다.

- 이 과정은 모두 포인터에 관한 것이다. RandomController 객체에서 포인터인 textField를 text field로 포인팅 한 것이다.


<textField Outlet 설정>

19.png


- Now you will set the Seed button’s target outlet to point to your instance of RandomController. Furthermore, you want the button to trigger RandomController’ s seed: method. 

- Control-drag from the button to your instance of RandomController. When the panel appears, select seed:


<Seed button의 target과 action을 설정>

20.png


- Similarly, you will set the Generate button’starget outlet to point to your instance of RandomController and set its action to the generate: method. Control-drag from the button to RandomController. Choose generate: in the Received Actions panel 


<Generate button의 target과 action을 설정>

21.png


** A Look at Objective-C


- 아래와 같은 코드를 Object-C에서는 "클래스 Rex는 클래스 Bar를 상속하며, Baz 인터페이스에 선언된 메소드들을 이행한다" 라고 한다.

#import <megacorp/Bar.h> 
#import <megacorp/Baz.h>

@interface Rex : Bar <Baz> { 
	...instance variables...
}
...methods...
@end


** Types and Constants in Objective-C


• id is a pointer to any type of object.

• BOOL is the same as char but is used as a Boolean value.

• YES is 1.

• NO is 0.

• IBOutlet is a macro that evaluates to nothing. Ignore it. (IBOutlet is a hint to Interface Builder when it reads the declaration of a class from a .h file.)

• IBAction is the same as void. It also acts as a hint to Interface Builder.

• nil is the same as NULL. We use nil instead of NULL for pointers to objects.


** Look at the Header File


- RandomController.h

- #import ensures that the file is included only once. You are importing<Foundation/ Foundation.h> because that includes the declaration of NSObject, which is the superclass of RandomController.

- declaration of the class starts with @interface

- To minimize conflicts between C code and Objective-C code, Objective-C keywords are prefixed by @

- a few other Objective-C keywords: @end, @implementation, @class, @selector, @protocol, @property, and @synthesize.


#import <Foundation/Foundation.h>

@interface RandomController : NSObject
{
	IBOutlet NSTextField *textField; 
}
- (IBAction)generate:(id)sender; 
- (IBAction)seed:(id)sender; 
@end



** Edit the Implementation File


- RandomController.m

- It contains the implementations of the methods

- The method increments the count instance variable and then sends the message setIntValue() to the textField object with count as an argument.


- (void)increment:(id)sender
{
	count++;
	[textField setIntValue:count]; 
}


- All methods are public, and all instance variables are protected. (In fact, there are visibility specifiers for instance variables, but they are rarely used. The default is protected, and that works nicely.)


#import "RandomController.h" 

@implementation RandomController
- (IBAction)generate:(id)sender
{
	// Generate a number between 1 and 100 inclusive int generated;
	generated = (int)(random() % 100) + 1;

	NSLog(@"generated = %d", generated);

	// Ask the text field to change what it is displaying
	[textField setIntValue:generated]; 
}

- (IBAction)seed:(id)sender
{
	// Seed the random number generator with the time srandom((unsigned)time(NULL));
	[textField setStringValue:@"Generator seeded"];
}

@end



- Remember that IBAction is the same as void.

- Because Objective-C is C with a few extensions, you can call functions, such as random() and srandom() from the standard C and Unix libraries.



** Build and Run

23.png 24.png



** awakeFromNib


- You will make the text field display the time and date that the application started.

- a NIB file is a collection of objects that have been archived. When the program is launched, the objects are brought back to life before the application handles any events from the user.

- After being brought to life but before any events are handled, all objects are automatically sent the message awakeFromNib. You will add an awakeFromNib method that will initialize the text field’s value.

- Add the awakeFromNib method to RandomController.m


- (void)awakeFromNib 
{
	NSDate *now;
	now = [NSDate date];
	[textField setObjectValue:now];
}


25.png


- You will never have to call awakeFromNib; it gets called automatically

26.png



** Documentation

27.png



** Chronology of an Application


- When the process is started, it runs the NSApplicationMain function, which creates an instance of NSApplication. 

- The application object reads the main NIB file and unarchives the objects inside. 

- The objects are all sent the message awakeFromNib. Then the application object checks for events. 


28.png


- When it receives an event from the keyboard mouse, the window server puts the event data into the event queue for the appropriate application,

- The application object reads the event data from its queue and forwards it to a user interface object, such as a button, and your code gets triggered.

- If your code changes the data in a view, the view is redisplayed. 

- Then the application object checks its event queue for another event. 

- This process of checking for events and reacting to them constitutes the main event loop.


29.png


- When the user chooses Quit from the menu, NSApp is sent the terminate: message. This ends the process, and all your objects are destroyed.



List of Articles
번호 제목 글쓴이 날짜 조회 수
21 Cocoa Programming 정리 08 - NSArrayController file Hojung 2013.02.25 5334
20 Cocoa Programming 정리 07 - Key-Value Coding 과 Key-Value Observing file Hojung 2013.02.20 4468
19 Cocoa Programming 정리 06 - 헬퍼 객체 file Hojung 2013.02.19 6803
18 Cocoa Programming 정리 05 - 타겟(Target)과 액션(Action) file Hojung 2013.02.14 5772
17 Cocoa Programming 정리 04 - 메모리 관리 file Hojung 2013.02.13 5623
16 Cocoa Programming 정리 03 - Objective-C file Hojung 2013.02.08 5410
» Cocoa Programming 정리 02 - 시작하기 file Hojung 2013.02.05 7997
14 Cocoa Programming 정리 01 - Cocoa란? Hojung 2013.02.05 4286
13 객체 변수 선언시 @private 사용 Hojung 2012.09.18 3716
12 테스트 코드 작성 Hojung 2012.08.22 3443
11 NSString 객체의 생성과 변환 Hojung 2012.08.22 4470
10 클래스 프로퍼티 설정 Hojung 2012.08.22 3494
9 클래스와 객체 - 1 Hojung 2012.08.22 3567
8 Interface and Implementation Hojung 2012.08.22 3322
7 Extends vs Implements의 개념과 차이점 - 2 Hojung 2012.08.22 3671
6 Extends vs Implements의 개념과 차이점 - 1 Hojung 2012.08.22 4260
5 포인터 Hojung 2012.08.22 3593
4 조건문 및 순환문 Hojung 2012.08.22 3733
3 변수형 및 객체형 Hojung 2012.08.22 3705
2 hello world Hojung 2012.08.22 3524
Board Pagination ‹ Prev 1 2 Next ›
/ 2

Designed by sketchbooks.co.kr / sketchbook5 board skin

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5