다이알로그는 MS 윈도우의 MessageBox와 같이 간단한 메시지 출력이나 사용자로 부터 선택사항을 입력 받는 윈도우입니다. cocoa에서 다이알로그를 구현하는 방법에 대해서 간단하게 알아 보겠습니다.


1. NSAlert

사용자 삽입 이미지

AppKit의 NSAlert은 위와 같이 간단한 경고창을 출력하게 해주는 기본 클래스 입니다. 아래는 NSAlert을 사용하여 위와 같은 알림창을 뛰우는 간단한 예입니다.

int returnValue;
NSAlert *alert = [[NSAlert alloc] init];
   
[alert addButtonWithTitle:@"button1"];
[alert addButtonWithTitle:@"button2"];
[alert addButtonWithTitle:@"button3"];
[alert setMessageText:
        [NSString stringWithUTF8String:"알림입니다."]];
[alert setInformativeText:
        [NSString stringWithUTF8String:"이알림은 테스트용 입니다."]];
[alert setAlertStyle:NSWarningAlertStyle];
  
returnValue = [alert runModal];
   
[alert release];

1) addButtonWithTitle:
버튼을 추가합니다.

2) setMessageText:
출력될 메시지를 설정합니다.

3) setInfomativeText:
메시지에 대한 상세 설명을 설정합니다.

4) setAlertStyle:
경고창의 아이콘을 결정합니다. 아이콘의 종류는 아래와 같습니다.

> NSWarningAlertStyle
일반적인 경고창입니다.

> NSInformationalAlertStyle
NSWarningAlertStyle과 동일합니다. 하위 호환성을 위해서 존재하는 것 같습니다

> NSWarningAlertStyle
사용자 삽입 이미지
좌측과 같이 어플리케이션 아이콘 뒤로 경고 아이콘을 출력합니다.




5) runModal
경고창을 오픈합니다. 종료시에는 사용자가 클릭한 버튼 값을 반환합니다. 첫번째 버튼부터 아래와 같이 정의되어 있습니다. 버튼이 세개 이상일 경우에는 1003부터 순차적으로 증가된 값을 반환합니다.

enum =  {
    NSAlertFirstButtonReturn  = 1000,
    NSAlertSecondButtonReturn  = 1001,
    NSAlertThirdButtonReturn  = 1002
};

6) Help
사용자 삽입 이미지

위와 같이 경고창 좌측에 Help(?) 버튼을 두고 사용자가 클릭시 원하는 행동을 지정할 수 있습니다. NSAlert에서 아래와 같이 속성을 설정합니다.

[alert setShowsHelp:YES]

   경고창에 Help 버튼을 출력합니다.

[alert setDelegate:self];
   Help 버튼 클릭시 alertShowHelp 메시지를 받을 오브젝트를 설정합니다.

아래는 버튼 클릭 시 웹페이지 또는 html 파일을 오픈하는 예입니다.

- (BOOL)alertShowHelp:(NSAlert *)alert
{   
    NSURL *url = [NSURL URLWithString:@"http://www.cocoadev.co.kr"];
    return [[NSWorkspace sharedWorkspace] openURL:url];

/* 번들 리소스의 help.html에서 불러 옵니다. 

    NSString *path = [[NSBundle mainBundle]
            pathForResource:@"help" ofType:@"html"];
    return [[NSWorkspace sharedWorkspace] openFile:path];
*/   
}

NSAlert *alert = [[NSAlert alloc] init];
   
[alert addButtonWithTitle:@"button1"];
[alert addButtonWithTitle:@"button2"];
[alert addButtonWithTitle:@"button3"];
   
[alert setMessageText:
        [NSString stringWithUTF8String:"알림입니다."]];
[alert setInformativeText:
        [NSString stringWithUTF8String:"이알림은 테스트용 입니다."]];
[alert setAlertStyle:NSCriticalAlertStyle];

[alert setShowsHelp:YES];
[alert setDelegate:self];
   
returnValue = [alert runModal];
   
[alert release];


2. Sheet
사용자 삽입 이미지

Sheet은 위와 같이 윈도우의 타이틀바 밑으로 내려오는 판넬을 의미합니다. NSAlert의 beginSheetModalForWindow으로 구현할 수 있으며 사용예는 아래와 같습니다.

- (void)alertDidEnd:(NSAlert *)alert
           returnCode:(int)returnCode
          contextInfo:(void *)contextInfo
{
    NSLog(@"returnCode %d", returnCode);
}

NSAlert *alert = [[NSAlert alloc] init];
   
[alert addButtonWithTitle:@"button1"];
[alert addButtonWithTitle:@"button2"];
[alert addButtonWithTitle:@"button3"];
[alert setMessageText:
        [NSString stringWithUTF8String:"알림입니다."]];
[alert setInformativeText:
        [NSString stringWithUTF8String:"이알림은 테스트용 입니다."]];
[alert setAlertStyle:NSWarningAlertStyle];
   
[alert beginSheetModalForWindow:[NSApp mainWindow]
                      modalDelegate:self
                     didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:)
                        contextInfo:NULL];  

1) Window
Sheet의 부모 윈도우를 설정합니다. 이 윈도우의 타이틀 바에서 Sheet가 오픈됩니다.

2) modalDelegate
Sheet의 메시지 처리를 위임 받을 오브젝트를 설정합니다. 이 오브젝트가 didEndSelector에서 설정된 메소드로 종료 메시지를 받습니다.

3) didEndSelector
Sheet가 종료될 때 불려지는 메소드입니다. 사용자의 선택에 따라 처리할 내용이 있을 경우, 여기서 처리합니다. 사용하지 않을 경우에는 nil로 설정합니다.

4) contextInfo
종료시 호출되는 메소드(didEndSelector)에 전달되는 사용자 정의 인자입니다.  종료 메소드에서 필요한 정보가 있을 경우에 설정합니다.


3. NSRunAlertPanel
NSRunAlertPanel 함수를 이용하면 NSAlert 클래스를 이용하는 것보다 편리하게 경고창을 구현할 수 있습니다. NSRunAlertPanel은 아래과 같이 선언되어 있습니다.

NSInteger NSRunAlertPanel (
  NSString *title,
  NSString *message,
  NSString *defaultButton,
  NSString *alternateButton,
  NSString *otherButton,
  ...
);

title, message,  세개의 버튼 타이틀을 인자로 가지고 있습니다. 사용하지 않는 버튼은 nil로 선언하면 출력되지 않습니다. 유의 하실 점은 마지막에 "..."로 가변인수를 가지고 있어 편리하게 사용할 수 있다는 점입니다.

이 가변인수는 message필드에 적용되며 실제 사용 예는 아래와 같습니다.
 
NSRunAlertPanel([NSString stringWithUTF8String:"알림입니다."],
      [NSString stringWithUTF8String:"이알림은 %d, %s 입니다."],
      @"default", @"alternate", @"other", 10, "test");

이를 실행하면 아래와 같습니다.
사용자 삽입 이미지

반환값은 아래와 같습니다. 오류(NSAlertErrorReturn)가 있을 경우를 제외하고는 각각 클릭된 버튼값을 반환합니다.

enum {
   NSAlertDefaultReturn = 1,
   NSAlertAlternateReturn = 0,
   NSAlertOtherReturn = -1,
   NSAlertErrorReturn = -2
};

NSAlert의 NSWarningAlertStyle과 같은 아이콘을 출력하실려면, NSRunCriticalAlertPanel을 사용하시면 됩니다.


4. NSBeginAlertSheet


사용자 삽입 이미지

 NSRunAlertPanel과 같은 사용법으로 NSAlert 클래스를 이용하는 것보다 편리하게 Sheet를 구현할 수 있습니다. NSBeginAlertSheet은 아래과 같이 선언되어 있습니다.

void NSBeginAlertSheet (
   NSString *title,
   NSString *defaultButton,
   NSString *alternateButton,
   NSString *otherButton,
   NSWindow *docWindow,
   id modalDelegate,
   SEL didEndSelector,
   SEL didDismissSelector,
   void *contextInfo,
   NSString *msg,
   ...
);

사용법은 이전의 예와 유사하며, 새로 추가된 인자만 설명하겠습니다.

1) didDismissSelector
Sheet가 사라될 때 불려지는 메소드이며, 사용하지 않을 경우에는 nil로 설정합니다.
didEndSelector보다 나중에 호출됩니다.

2) contextInfo
종료시 호출되는 메소드(didEndSelector, didDismissSelector)에 전달되는 사용자 정의 인자입니다.  종료 메소드에서 필요한 정보가 있을 경우에 설정합니다.

Sheet 사용 예는 아래와 같습니다.

- (void)sheetDidEndShouldDelete: (NSWindow *)sheet
                     returnCode: (int)returnCode
                    contextInfo: (void *)contextInfo
{
    NSLog(@"result %d", returnCode);
}

NSBeginAlertSheet([NSString stringWithUTF8String:"알림입니다."],
                      @"default",
                      @"alternate",
                      @"other",
                      [NSApp mainWindow],
                      self,
                      @selector(sheetDidEndShouldDelete:returnCode:contextInfo:),
                      NULL,
                      NULL,
                      [NSString stringWithUTF8String:"이알림은 %d, %s 입니다."],
                      10, "test");

NSAlertParnel과 동일하게 NSBeginCriticalAlertSheet을 사용하면 경고 아이콘을 출력할 수 있습니다.
AND

> 01.08 08:54 항목 더블 클릭시 항상 마지막에 저장한 블로그의 링크로 가는 오류를 수정했습니다. 이전에 받으신 분들은 새로 다운로드 받아 주세요. 불편을 드려 죄송합니다.

티돌이가 1.0B로 업그레이드 되었습니다. 저도 2개의 블로그로 몇시간 사용 안해보고 업로드 하는 것이라 오류가 있을 수 있을 수 있습니다. 제가 사용하면서 오류가 발견하거나 알려 주시는 분들이 계시면 수정해서 다시 올리겠습니다.

- 변경 내역
  • 아이콘 변경 - 이쁜 아이콘으로 변경하였습니다.
  • 다중 블로그 등록 - 30개 이하로 여러 tistory 블로그를 등록하실 수 있습니다.

1. 실행

사용자 삽입 이미지
이전과 같이 다운로드 받으신 후에 압축을 풀면 바로 사용가능 합니다.

처음 티돌이를 실행하면 좌측과 같이 빈화면이 실행됩니다. 이전에 등록해 놓으신 블로그 정보를 가지고 오지 않습니다. 그래서 사용하실 블로들을 새로 등록하셔야 합니다.

티돌이 메뉴에서 환경설정을 클릭하시고 아래의 내용을 참조하여 환경을 설정하고 사용하시는 티스토리 블로그들을 등록합니다.


2. 설정
 
1) 일반 설정
사용자 삽입 이미지
일반 설정에 있는 항목들은 모든 블로그들에 영향을 줍니다.

내용은 이전과 동일합니다.







2) 블로그 목록
사용자 삽입 이미지
블로그 목록에서는 tistory 블로그들을 등록/변경/삭제하실 수 있습니다.

변경시에는 해당 블로그를 더블클릭하시면 됩니다. 변경된 내용은 다시 실행할 필요 없이 바로 적용이 됩니다.





3) 블로그 등록/수정
사용자 삽입 이미지
> 블로그명: 해당 블로그의 이름을 입력합니다.
> 블로그 주소: "cocoadev.tistory.com"과 같이 블로그의 도메인 주소를 입력합니다. "/"이나 "html"등을 입력하시면 안됩니다.

> 아이디/패스워드: 관리자 로그인 아이디/패스워드를 입력합니다.


4) 테스트
사용자 삽입 이미지
티돌이 상단에서 등록된 블로그들을 선택하시면, 해당 블로그의 내용들이 출력됩니다.

현재 선택된 블로그의 오늘 방문자 수가 티돌이 아이콘에 표시됩니다. 선택되지 않은 블로그라도 아이콘에 방문자수가 표시되지는 않지만 댓글등록 등의 변경이 생기면 알려 줍니다.






3. 감사드립니다.

사실 사용하는데 별 지장이 없어 항상 업그레이드를 미루었는데, 아래의 두분께서 아이콘을 보내 주셔서 어쩔수없이(?) 업그레이드를 하게되었습니다.

사용자 삽입 이미지
kharus 님이 보내 주신 아이콘입니다.

보내 주신지 몇개월 되었는데 이제서야 사용하게 되었네요. 감사합니다.


사용자 삽입 이미지
oinon님이 보내 주신 아이코입니다.

버그도 알려 주시고 멋진 아이콘 만들어 주셔서 감사합니다.


둘다 이쁘고 어느 한분의 아이콘을 선택할 수가 없어 아이콘만 틀린 두가지 버젼으로 배포합니다. 아이콘이외에는 차이가 없으니 마음에 드는 아이콘 버젼을 다운로드 받으시면 됩니다.

사용자 삽입 이미지



사용자 삽입 이미지



이 후 부터는 배포상의 편의를 위해서 한 아이콘만 사용할려고 합니다. 마음에 드시는 아이콘을 댓글로 알려 주시면 많은 분들이 선택하신 아이콘으로 사용할려고 합니다.

추후 업그레이드는 테터툴즈와 워드프레스, 두개의 설치형 블로그를 지원할려고 생각하고 있습니다. 티스토리와 다르게 MySQL에 직접 접속해서 데이터를 가져오는 방식으로 만들려고 합니다. 설치형 블로그를 사용하시는 분들 중 대부분이 호스팅 업체를 이용하실 것 같은데, MySQL 계정이 외부접속도 허용하도록 설정되어 있는지 모르겠네요. 알아봐야 할 것 같습니다.
AND

사용자 삽입 이미지
스티브 워즈니악에 관한 책이 나왔습니다. 개인적으로 존경하는 분이라 무척 관심이 갑니다. 애플을 나와 아이들 교육을 위해 초등학교 교사-교수도 아니고 초등학교 교사라니 재능을 낭비하는 게 아닌가 하는 생각도 드네요-로 들어가 자비로 맥을 구입하여 아이들을 가르쳤다고 합니다. 지금은 다시 애플로 갔다는 얘기를 들은 것 같습니다.

애플과 맥에 많은 관심이 있지만 스티브잡스의 아이콘이 나왔을 때는 별 관심이 없었는데, 이 책은 구입해서 읽어 보고 싶다는 생각이 듭니다. 인상이 다소 날카로워 보이는 잡스와는 달리 이웃집 아저씨처럼 푸근하고 친근해 보이지 않나요?

(이미지 출처:yes24)

그러고 보니 빌게이츠의 "미래로 가는길"과 "생각의 속도"는 목차도 안보고 책꽂이에 몇년째 그대로 있습니다. 두권 모두 이전에 친구 와이프에게 선물로 받은 것들입니다. 아마 제가 IT 관련 일을 하고 있으니 가장 유명한 빌게이츠의 책을 선물로 준 것 같습니다.

읽지 않은 이유는 빌게이츠나 MS를 싫어해서가 아니라 프로그래밍에 직접적인 관련이 없어서였습니다. 웬지 회장님들의 책은 별로 관심이 가지 않았습니다. 이젠 나이에 맞게(?) 보통 사람들이 보는 베스트셀러나 교양서적도 읽어 봐야 겠다는 생각이 듭니다. 너무 한쪽으로 치우친 교양 없는 삶을 산 것 같습니다.

사용자 삽입 이미지
이왕 책 광고 하는김에 하나 더 해보겠습니다. 요즘 쉬엄쉬엄 읽기 시작한 Beautiful Code란 책입니다. 내용은 38명의 유명한 프로그래머들이 추천하는 코드와 그와 관련된 설명입니다.

앞페이지를 보면 저자가 찰스 페졸드외 37인으로 되어 있는데, 나머지 분들도 "외 37인"으로 뭉퉁거려질 분들은 아닙니다. 첫장이 브라이언 커니핸 옹이니까요.

아직 첫장도 다 안읽었지만 추천할 수 있는 책이라는 생각이 듭니다.

(이미지 출처:yes24)

다만 몇 페이지 안 읽었지만 번역이 조금 걱정되는데요. 1장을 보면 제목의 일부인 pattern matching이 패턴 부합(附合)으로 번역되어 있습니다. 매칭이라고 그냥 써주는 것이 이해가 더 빠를 것 같고, 한자로 쓴다면 符合이 맞는 것 같은데 확실하지 않습니다.

2008.01.18 추가
저자분이 저의 다른 블로그에 댓글을 주져서 확인해 보았습니다. 다시 보니 유한자동자로 번역되어 있는 것을 제가 착각해서 "유한자동차"로 잘 못 이해했습니다. 저의 불찰로 잘못된 정보를 드려 죄송합니다.

아울러 역자분의 홈페이지를 찾아 가보니 번역에 관해서 많은 노력을 하고 계신 실력있는 분이셨습니다. 저의 무지와 과오로 역자분께 심려를 끼쳐 드려 죄송하다는 말씀 드립니다.

그리고 다음 페이지에 finite automata를 "유한자동차"로 번역을 해 놓은 부분도 잘 이해가 가지 않습니다. 아래와 같은 문장이 있습니다.

"사실 정규식이 나타내고자 하는 바는 유한자동차가 나타내고자 하는 바와 동등하다."
 
"유한자동차"는 중국의 자동차 회사 이름 같다는 느낌이 듭니다.

역자의 약력을 보니 오래전 부터 관련서적의 번역일을 해왔고, 많은 훌륭한 책들을 번역하신 실력있는 분같습니다. 역자가 의도적으로 이렇게 표현한 것 같은데, 본래 오토마타를 이런 표현으로 사용되는 건지 잘 모르겠네요. 아직 더 읽어봐야 겠지만 내용 자체는 추천합니다.

2007년 마지막 포스트는 책광고로 마감합니다. ^^

'책 이야기 > IT 일반' 카테고리의 다른 글

미래를 만든 Geeks  (1) 2010.06.24
번역서의 표지 디자인  (8) 2009.08.31
소프트웨어 크리에이티비티 2.0  (0) 2009.07.21
드리밍 인 코드  (2) 2009.05.20
레이몬드 첸의 윈도우 개발 282 스토리  (0) 2008.01.18
AND