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

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print Files
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print Files
Chapter 5 Target/Action

- AppKit framework를 이해하기 위해 NSControl. NSButton, NSSlider, NSTextView, NSColorWell 클래스부터 시작한다. 참고로 이 클래스들은 모두 NSControl의 서브클래스이다.

- control은 target과 action이 있으며, target은 단순히 다른 객체를 가리키는 포인터이고 action은 target에 보내는 메시지(selector)이다.

- target and action
A Button Has a Target and an Action
01.png

사용자가 contorl과 상호작용할 때 action 메시지를 target으로 보내게된다. 예를들어, 버튼을 클릭하면 버튼은 target으로 action 메시지를 보낸다.

The Button Sends a Message
02.png

action 메소드에는 sender라는 하나의 인수가 있다. 리시버는 이것으로 어느 control이 메시지를 보냈는지 알 수 있다. Often, you will call back to the sender to get more information. For example, a check box will send its action message when it is turned on and when it is turned off. After getting the action message, the receiver might call back to the button to find out whether it is currently on or off:

- (IBAction)toggleFoo:(id)sender
{
	BOOL isOn = [sender state];
	... 
}



NSControl의 이해를 위해 상속관계의 클래스를 살펴본다. (Inheritance Diagram for NSControl)
03.png

- Some Commonly Used Subclasses of NSControl
: 가장 많이 사용되는 control인 NSButton, NSSlider, NSTextField에 대해 간단하게 알아본다.

<NSButton>
: Here are three messages that you will frequently send to buttons.

- (void)setEnabled:(BOOL)yn
Enabled buttons can be clicked by the user. Disabled buttons are grayed out.

- (NSInteger)state
Returns NSOnState (which is 1) if the button is on, or NSOffState (which is 0) if the button is off.
This method allows you to see whether a check box is checked or unchecked.

- (void)setState:(NSInteger)aState
This method turns the button on or off. It allows you to check or uncheck a check box programmatically. Set the state to NSOnState to check the check box and to NSOffState to uncheck it.

<NSSlider>
04.png

- (void)setFloatValue:(float)x
Moves the slider to x.
- (float)floatValue
Returns the current value of the slider.

<NSTextField>
: Text fields may or may not be editable. Uneditable text fields are commonly used as labels on a window. NSSecureTextField is a subclass ofNSTextField and is used for such things as passwords. As the user types, bullets appear instead of the typed characters. You cannot copy or cut from an NSSecureTextField.

Here are a few of the most commonly used NSTextField methods:
- (NSString *)stringValue
- (void)setStringValue:(NSString *)aString

Allow you to get and set the string data being displayed in the text field.
- (NSObject *)objectValue
- (void)setObjectValue:(NSObject *)obj

text field에 임의의 객체 타입으로 데이터를 set 또는 get 할 수 있으며, formatter를 사용하는 것이 도움이 된다. NSFormatters을 사용해 스트링을 다른 타입으로 또는 그 반대로 리폼할 수 있다. formatter가 없으면 description 메소드를 사용하게 된다.


- Control 사용 예 (문장을 읽는 speakline 코딩)
05.png

object Diagram
06.png

1. Project 'SpeakLine' 생성
07.png 
08.png

2. 윈도우 생성 후 리사이즈를 못하게 설정 (editor에서는 가능)
09.png

3. Library panel에서 드래그앤드랍으로 하나의 text field와 두개의 버튼을 생성
10.png

참고: Enabling Assistant Editor
여기서는 Assistant Editor을 enable하여 현재 선택된 파일의 상응하는 파일을 보여준다. 여기서 MainMenu.xib에 상응하는 파일은 SpeakLineAppDelegate.h 이다.
11.png

2장에서 outlet과 action을 수동으로 생성하고 빌더를 이용해 사용자 인터페이스 객체간 연결을 배웠다. 2장 처럼 모든 outlet과 action을 모두 타이핑해도 되지만, 여기서는 Assistant Editor를 이용해 좀 더 쉽게 작업하도록 한다.

4. Interface Builder를 이용한 연결 생성 (버튼 action, 텍스트필드 outlet)

버튼같은 인터페이스 객체가 알아야할 객체로 드래그앤드랍을 통해 연결한다. 예를 들면, 사용자가 Stop 버튼을 클릭하면 버튼은 SpeakLineAppDelegate로 메시지를 보내야 한다. 그러므로 버튼 객체는 SpeakLineAppDelegate에 대해 알아야 한다.

아래와 같은 Ctrl-drag를 통해 인터페이스 객체와 Action을 연결한다.


12.png 13.png 

14.png

Speak 버튼도 위와 같은 방법으로 연결을 만든다.
15.png

텍스트 라인을 synthesize 하기 위해서는 SpeakLineAppDelegate가 사용자에게 텍스트 입력을 받아야 한다. 그러므로 text field를 위한 포인터가 있어야 한다. 위와 동일한 방식으로 연결을 만든다. 여기서 Connection은 action이 아니라 outlet이다.
16.png 17.png

xcode는 위와 같이 @property 라인을 생성한다.

완성된 SpeakLineAppDelegate.h은 아래와 같다.

#import <Cocoa/Cocoa.h>

@interface SpeakLine_AppDelegate : NSObject <NSApplicationDelegate>

@property (assign) IBOutlet NSWindow *window;
@property (weak) IBOutlet NSTextField *textField;

- (IBAction)StopIt:(id)sender;
- (IBAction)SayIt:(id)sender;

@end


위 연결을 생성한 후 SpeakLineAppDelegate.m을 보면 sayIt: 과 stopIt: action에 대응하는 코드가 아래와 같이 생성된 것을 알 수 있다.
#import "SpeakLine_AppDelegate.h"

@implementation SpeakLine_AppDelegate
@synthesize textField;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
}

- (IBAction)StopIt:(id)sender {
}

- (IBAction)SayIt:(id)sender {
}
@end

이제 모든 연결을 생성하였고, 마지막 speechSynth 연결 및 SpeakLineAppDelegate 클래스의 이행코드는 프로그래밍으로 작성한다.

5. SpeakLineAppDelegate 클래스 이행하기 (SpeakLineAppDelegate.m 작성)

SpeakLineAppDelegate.h에 아래와 같이 speechSynth 인스턴스 변수를 생성한다.
#import <Cocoa/Cocoa.h>
 
@interface SpeakLine_AppDelegate : NSObject <NSApplicationDelegate>
{
    NSSpeechSynthesizer *speechSynth;
}
 
@property (assign) IBOutlet NSWindow *window;
@property (weak) IBOutlet NSTextField *textField;
 
- (IBAction)StopIt:(id)sender;
- (IBAction)SayIt:(id)sender;
 
@end


SpeakLineAppDelegate.m을 아래와 같이 작성


#import "SpeakLine_AppDelegate.h"

@implementation SpeakLine_AppDelegate

@synthesize window;
@synthesize textField;

- (id)init
{
    self = [super init];
    if (self) {
        // 디버깅용 NSLog
        NSLog(@"init");
        
        // 새로운 NSSpeechSynthesizer 인스턴스를 기본 voice 인수와 가지고 생성
        speechSynth = [[NSSpeechSynthesizer alloc] initWithVoice:nil];
    }
    return self;
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
}

- (IBAction)StopIt:(id)sender {
    NSLog(@"stopping");
    [speechSynth stopSpeaking];
}

- (IBAction)SayIt:(id)sender {
    NSString *string = [textField stringValue];
    
    // 문자열길이가 0인지 체크. 즉, 문자열이 있는지 체크
    if ([string length] == 0) {
        NSLog(@"string from %@ is of zero-length", textField);
        return;
    }
    [speechSynth startSpeakingString:string];
    NSLog(@"Have started to say: %@", string);
}
@end


6. 빌드 및 실행
18.png


- 도전과제 (입력된 문자열의 길이 출력하기)

1. Project 생성

2. 윈도우 및 인터페이스 객체 생성
19.png

3. 연결 생성
20.png

4. GetSTringLengthAppDelegate.m 클래스 작성

#import "GetStringLengthAppDelegate.h"

@implementation GetStringLengthAppDelegate
@synthesize textField;
@synthesize stringLengthInfo;

- (id)init
{
    self = [super init];
    if (self) {
        // 디버깅용 NSLog 추가
        NSLog(@"init");
    }
    return self;
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
}

- (IBAction)getStringLength:(id)sender {
    // NSTextField 인스턴스인 textField에서 길이 구하기
    NSUInteger length = [[textField stringValue] length];
    
    // 디버그를 위해 문자열 길이를 unsigned long 포맷으로 출력
    NSLog(@"length: %lu", length);

    // label에 출력하기 위해 stringLengthInfo에 문자열 길이를 포함한 문자열 입력
    [stringLengthInfo setStringValue:[NSString stringWithFormat:@"'%@' has %lu characters", [textField stringValue], length]];
}
@end



여기서 아래 라인을 살펴보면,

[stringLengthInfo setStringValue:[NSString stringWithFormat:@"'%@' has %lu characters", [textField stringValue], length]];

-------- 분석 --------
[textField stringValue]
=> NSTextField 인스턴스인 textField로 stringValue 메시지를 보냄. 리턴타입은 NSString

[NSString stringWithFormat:@"'%@' has %lu characters", [textField stringValue], length]]
=> NSString 클래스에 클래스 메서드인 stringWithFormat 호출 (메시지 보냄). 여기서 인수로 포맷 및 그에 대응하는 인수을 보냄. 리턴타입은 NSString

[stringLengthInfo setStringValue:[NSString stringWithFormat:@"'%@' has %lu characters", [textField stringValue], length]];
=> NSTextField 인스턴스인 stringLengthInfo에 setStringValue 메시지를 보냄 (인수로 NSString)
-----------------------

5. 빌드 및 실행
21.png 22.png

List of Articles
번호 제목 글쓴이 날짜 조회 수
21 Cocoa Programming 정리 08 - NSArrayController file Hojung 2013.02.25 5436
20 Cocoa Programming 정리 07 - Key-Value Coding 과 Key-Value Observing file Hojung 2013.02.20 4564
19 Cocoa Programming 정리 06 - 헬퍼 객체 file Hojung 2013.02.19 6919
» Cocoa Programming 정리 05 - 타겟(Target)과 액션(Action) file Hojung 2013.02.14 5865
17 Cocoa Programming 정리 04 - 메모리 관리 file Hojung 2013.02.13 5735
16 Cocoa Programming 정리 03 - Objective-C file Hojung 2013.02.08 5519
15 Cocoa Programming 정리 02 - 시작하기 file Hojung 2013.02.05 8119
14 Cocoa Programming 정리 01 - Cocoa란? Hojung 2013.02.05 4350
13 객체 변수 선언시 @private 사용 Hojung 2012.09.18 3795
12 테스트 코드 작성 Hojung 2012.08.22 3535
11 NSString 객체의 생성과 변환 Hojung 2012.08.22 4572
10 클래스 프로퍼티 설정 Hojung 2012.08.22 3580
9 클래스와 객체 - 1 Hojung 2012.08.22 3663
8 Interface and Implementation Hojung 2012.08.22 3388
7 Extends vs Implements의 개념과 차이점 - 2 Hojung 2012.08.22 3743
6 Extends vs Implements의 개념과 차이점 - 1 Hojung 2012.08.22 4345
5 포인터 Hojung 2012.08.22 3679
4 조건문 및 순환문 Hojung 2012.08.22 3812
3 변수형 및 객체형 Hojung 2012.08.22 3789
2 hello world Hojung 2012.08.22 3592
Board Pagination ‹ Prev 1 2 Next ›
/ 2

Designed by sketchbooks.co.kr / sketchbook5 board skin

나눔글꼴 설치 안내


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

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

설치 취소

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5