NSObject에 정의된 이 메서드가 예외를 발생시키기 때문에 사용자가 ExpectedRaise필드를 비워 두면 여러분의 객체는 예외를 발생시킬 것이다. 일반적으로 setNilValueForKey:를 재정의해서 인스턴스 변수를 어떤 기본 값으로 정한다. 이 경우 Person 클래스에 있는 이 메서드를 재정의하여 expectedRaise를 0.0으로 설정한다. 다음 메서드를 Person.m에 추가하자.
- (void)setNilValueForKey:(NSString *)key {
if ([key isEqual:@"expectedRaise"]) {
[self setExpectedRaise:0.0];
} else {
[super setNilValueForKey:key];
}
}
cocoa
- -setNilValueForKey:(NSString *)s 2009.09.09
- Cocoa 3rd - Delegate 연습문제(데이터 소스 만들기) 2009.09.09
- Cocoa Programming for Mac OS X(한글판) 수정 부분#1 2008.10.01
- Xcode에서 #pragma 주석이 인식이 제대로 안될 경우 2008.09.25
-setNilValueForKey:(NSString *)s
Cocoa 3rd - Delegate 연습문제(데이터 소스 만들기)
//
// AppController.h
// MakeDataSource
//
// Created by JoonHo Son on 09. 9. 8..
// Copyright 2009 JoonHo Son(s9712094@gmail.com). All rights reserved.
//
#import <Cocoa/Cocoa.h>
@interface AppController : NSObject {
IBOutlet NSTextField *textField;
IBOutlet NSTableView *tableView;
NSMutableArray *array;
}
- (IBAction)addTodo:(id)sender;
@end
//
// AppController.m
// MakeDataSource
//
// Created by JoonHo Son on 09. 9. 8..
// Copyright 2009 JoonHo Son(s9712094@gmail.com). All rights reserved.
//
#import "AppController.h"
@implementation AppController
#pragma mark -
#pragma mark override methods
- (id)init {
if (![super init]) {
return nil;
}
array = [[NSMutableArray alloc] init];
return self;
}
- (void)dealloc {
[textField release];
[tableView release];
[array release];
[super dealloc];
}
#pragma mark -
#pragma mark private methods
- (void)addTodo:(id)sender {
NSString *string = [textField stringValue];
if ([string length] == 0) {
NSLog(@"You must input TODO text");
return;
}
[array addObject:string];
[tableView reloadData];
[textField setStringValue:@""];
int count = [array count];
int i;
for (i = 0; i < count; i++) {
NSLog(@"%d contents : %@", i, [array objectAtIndex:i]);
}
}
#pragma mark -
#pragma mark delegate methods
- (int)numberOfRowsInTableView:(NSTableView *)tv {
return [array count];
}
- (id)tableView:(NSTableView *)tv
objectValueForTableColumn:(NSTableColumn *)tableColumn
row:(NSInteger)row; {
NSString *v = [array objectAtIndex:row];
return v;
}
- (void)tableView:(NSTableView *)tv
setObjectValue:(id)object
forTableColumn:(NSTableColumn *)column
row:(int)row {
[array replaceObjectAtIndex:row withObject:object];
}
@end
Cocoa Programming for Mac OS X(한글판) 수정 부분#1
// 테이블 뷰가 화면에 나타날 때 기본 목소리가 선택되어야 한다.
NSString *defaultVoice = [NSSpeechSynthesizer defaultVoice];
NSArray *voices = [NSSpeechSynthesizer availableVoices];
int defaultRow = [voices indexOfObject:defaultVoice];
[tableView selectedRow:defaultRow byExtendingSelection:NO];
[tableView scrollRowToVisible:defaultRow];
이 부분을 책에 있는 그대로 입력하게 되면 다음과 같은 경고(warning)이 출력된다.
Xcode의 개발자 문서에서 해당 메서드를 검색하니 deprecated 되었단다. NSTableView의 selectedRow:byExtendingSelection 대신 권장되는 selectedRowIndexs:byExtendingSelection 이다.
deprecated된 기존의 메서드의 NSInteger 타입이 아닌, NSIndexSet 타입의 파라미터를 받게된다. 따라서 위의 경고가 출력된 부분을 다음과 같이 수정하면 이상없이 빌드 / 실행(디버그) 할 수 있다.
[tableView selectRowIndexes:
[NSIndexSet indexSetWithIndex:defaultRow] byExtendingSelection:NO];