[출처] - http://www.cocoadev.co.kr/94





흔히 사용되는 컨트롤들의 간단한 사용법을 알아 보겠습니다.
만들려는 예제의 모습은 좌측과 같습니다. 각 컨트롤들의 설정에 따라서 상단 텍스트 필드의 내용을 변경하여 보여주는 샘플을 작성해 보겠습니다.

이 예제를 따라 해보기 위해서는 인터페이스 빌더의 사용법과  인스턴스 생성, 인스턴스와의 연결 등에 관한 기본 내용을 알고 있어야 합니다. 잘 이해가지 않는 분들은 이전 포스트를 확인해 보신 후에 다시 보시기 바랍니다.



1. AppController 생성

XCode 에서 Cocoa Application으로 새로운 프로젝트를 생성합니다. 다시 New File에서 Objective-C Class를 선택한 후에 AppController란 이름으로 새로운 클래스를 생성합니다.

1) AppController.h 변경
이번 장에서 사용할 컨트롤들은 아래와 같습니다. 아래의 컨트롤들을 인터페이스 빌더에서 연결하기 위해 IBOutlet 변수들을 생성합니다.
NSTextField, NSTableView, NSMatrix, NSComboBox, NSColorWell, NSSlider, NSButton, NSProgressIndicator  

사용자의 조작으로 컨트롤의 상태가 변하는 알림 메시지를 받을 메소드를 생성합니다. 각 메소드는 아래와 같습니다.

- (IBAction)setDisplayText:(id)sender;
- (IBAction)adverbSelecterChanged:(id)sender;
- (IBAction)alignSliderChanged:(id)sender;
- (IBAction)notCheckerChanged:(id)sender;
- (IBAction)subjectMatrixChanged:(id)sender;
- (IBAction)colorWellChanged:(id)sender;

AppController.h
#import <Cocoa/Cocoa.h>

@interface AppController : NSObject {
    IBOutlet NSTextField* displayString;
    IBOutlet NSTableView* wordList;
    IBOutlet NSMatrix* subjectMatrix;
    IBOutlet NSComboBox* adverbSelecter;
    IBOutlet NSColorWell* colorWell;
    IBOutlet NSSlider* alignSlider;
    IBOutlet NSButton* notChecker;
    IBOutlet NSProgressIndicator* progressBar;   
}

- (int)numberOfRowsInTableView:(NSTableView *)tableView;
- (id)tableView:(NSTableView *)tableView
    objectValueForTableColumn:(NSTableColumn *)tableColumn
            row:(int)row;

- (IBAction)setDisplayText:(id)sender;
- (IBAction)adverbSelecterChanged:(id)sender;
- (IBAction)alignSliderChanged:(id)sender;
- (IBAction)notCheckerChanged:(id)sender;
- (IBAction)subjectMatrixChanged:(id)sender;
- (IBAction)colorWellChanged:(id)sender;

@end


2) AppController.m 변경

TableView는 좌측과 같이 테이블 형식으로 목록을 보여주는 컨트롤입니다. 각 셀에 데이터를 입력하기 위해서는 데이터를 등록하여 주는 dataSource를 지정해야 합니다.

여기서는  나중에 인터페이스 빌더에서 AppController를 dataSource로 등록하겠습니다. tableView의 dataSource가 되면 데이터를 요구하는 메시지에 응답하기 위해서 아래와 같은 두개의 메소드를 구현해야 합니다.

- (int)numberOfRowsInTableView:(NStableView *)tableView;
목록의 갯수를 반환합니다.

- (id)tableView:(NSTableView *)tableView
    objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row

각 셀의 데이터를 반환합니다. 이 반환된 값들로 각 셀들이 채워집니다. 셀에 데이터를 등록하는 것은 다음 포스팅에서 구현해 보겠습니다.

메시지를 처리하는 각 메소드들은 실제 기능을 구현하기 전에 정확히 동작하는지 확인하기 위해서 NSLog를 추가합니다. 소스파일 전체는 아래와 같습니다.

AppController.m
#import "AppController.h"

@implementation AppController

- (void)awakeFromNib
{
}

- (void)dealloc
{
    [super dealloc];
}

- (IBAction)setDisplayText:(id)sender
{
    NSLog(@"Button colicked");
}

- (IBAction)adverbSelecterChanged:(id)sender
{
    NSLog(@"adverbSelecter changed");
}

- (IBAction)alignSliderChanged:(id)sender
{
    NSLog(@"alignSlider Changed");
}

- (IBAction)notCheckerChanged:(id)sender
{
    NSLog(@"notChecker changed");
}

- (IBAction)subjectMatrixChanged:(id)sender
{
    NSLog(@"subject matix");
}

- (IBAction)colorWellChanged:(id)sender
{
    NSLog(@"colorWell changed");
}

- (int)numberOfRowsInTableView:(NSTableView *)tableView
{
    NSLog(@"tableView getRowCount");
    return 1;
}

- (id)tableView:(NSTableView *)tableView
    objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row
{
    NSLog(@"tableView getColumnValue");
    return nil;
}

@end


2. 인터페이스 빌더에서 작업
 
1) 컨트롤 배치

윈도우에 각 컨트롤들이 배치되어야 할 모습은 아래와 같습니다.


팔레트에서 마우스 포인터를 해당 컨트롤 위에 놓으면 좌측의 빨간 화살표가 가르키는 것과 같이 컨트롤의 종류를 확인할 수 있습니다.

위의 이미지를 참조하여 팔레트에서 각각의 콘트롤들을 드래그로 가지고 와서 배치 합니다.





2) 속성 설정
각각의 콘트롤들의 속성을 변경합니다.

NSTextField
텍스트필드의 옵션을 좌측과 같이 설정합니다. 사용자의 입력은 받지 않기 때문에 Editable, Enabled를 해제합니다.


NSTableView
Attributes에서 Columns를 2로 설정합니다.
NSTableView를 더블클릭하면 좌측과 같이 푸른 테두리가  나타납니다. 이 상태에서 컬럼을 더블클릭하여 입력 모드로 변경되면 이름을 변경할 수 있습니다.

각각 목적어, 동사로 변경합니다.

NSMatrix
Rows 는 1 Cols는 2로 설정하고 Mode가 'Radio'로 되어 있음을 확인합니다.

NSComboBox
좌측과 같이 Visible Items를 4로 입력하고 4개의 항목을 추가합니다.

추가는 하단의 입력필드에서 이름을 입력 후에 [+] 버튼을 클릭합니다. 삭제는 아이템을 선택한 후에 [-]버튼을 클릭합니다.



NSColorWell
변 경없이 기본값을 유지합니다.

NSSlider
좌측과 같이 최소값을 0.0, 최대값을 100.0, 기본값을 50.0으로 설정합니다. 세단계만 선택되게 하기 위해 Number Of Markers를 3으로  Stop on ticks marks only를 체크 합니다.


NSButton
Type이  'CheckBox'로 되어 있음을 확인하고 Title에 '부정어로 만듭니다.'로 입력합니다.

NSProgressIndicator  
MinumRange 는 0.0, MaximumRange는 100.0으로 설정하고 Indeterminate를 체크 합니다.

2) AppControll 인스턴스 생성
AppController.h 를 인터페이스 빌더의 MainMenu.nib 윈도우로 드래그 해 놓습니다. Classes 항목에서 AppController를 우클릭하여 Instantiate AppController를 선택하여 인스턴스를 생성합니다.

이제 아래의 연결된 모습을 참조하여 윈도우의 각 항목들을 AppController의 IBOutlet 변수와 IBAction 메소드로 연결합니다.

각 컨트롤들은 아래의 AppController의 IBAction 메소드와 연결됩니다.
  • adverbSelecterChanged <- NSComboBox
  • alignSliderChanged <- NSSlider
  • notCheckerChanged <-NSButton (Check Box)
  • subjectMatrixChanged <- NSMatrix
  • colorWellChanged <- NSColorWell
  • setDisplayText <- NSButton (적용 Button)
 
마지막으로 위에 설명한 대로 좌측과 같이  TableView의 dataSource를 AppControll로 설정합니다.








이 제 컴파일 하고 실행한 후에 각각의 콘트롤의 값과 상태를 변경하여 봅니다. 그리고 RunLog 창에서 아래와 같이 메시지를 보내고 받는지 확인합니다.

잘 동작하지 않는 분들은 아래의 샘플 파일을 다운로드 받으신 후에 비교해 보시기 바랍니다.





이전 포스트에 이어서 프로그램을 완성해 보겠습니다. 이전의 소스에서 아래의 청색으 로 된 부분을 추가합니다.

1. AppController.h 수정

#import <Cocoa/Cocoa.h>

@interface AppController : NSObject {
    NSMutableString *curString;
    NSString* dataArray[3][2];
   
    IBOutlet NSTextField* displayString;
    IBOutlet NSTableView* wordList;
    IBOutlet NSMatrix* subjectMatrix;
    IBOutlet NSComboBox* adverbSelecter;
    IBOutlet NSColorWell* colorWell;
    IBOutlet NSSlider* alignSlider;
    IBOutlet NSButton* notChecker;
    IBOutlet NSProgressIndicator* progressBar;   
}

- (int)numberOfRowsInTableView:(NSTableView *)tableView;
- (id)tableView:(NSTableView *)tableView
    objectValueForTableColumn:(NSTableColumn *)tableColumn
            row:(int)row;

- (IBAction)setDisplayText:(id)sender;
- (IBAction)adverbSelecterChanged:(id)sender;
- (IBAction)alignSliderChanged:(id)sender;
- (IBAction)notCheckerChanged:(id)sender;
- (IBAction)subjectMatrixChanged:(id)sender;
- (IBAction)colorWellChanged:(id)sender;
- (IBAction)wordListChanged:(id)sender;
@end


2. 인터페이스 빌더에서 수정

변경한 소스를 저장한 후에 변경된 사항을 인터페이스 빌더에 적용하기 위해서 다시 AppController.h 파일아이콘을 드래그 하여 인터페이스 빌더의 MainMenu.nib에 놓습니다.

좌측과 같이 윈도우의 TableView중에 목적어 컬럼을 선택합니다. 속성창을 열어 Identifier 항목을 1로 설정합니다.

이와 동일하게 동사 컬럼의 Identifier는 2로 설정합니다.




AppController에서 새로 추가한 메소드인 wordListChanged르 TableView에 연결합니다.

TableView를 선택하고 Control키를 클릭한 채 마우스로 드래그 하여 AppController 인스턴스에 가져다 놓습니다. 좌측의 속성 화면에서 wordListChanged를 선택하고 연결합니다.

(연결이 어려우신 분들은 이전 포스트를 참조하세요.)


3. AppController.m 수정

#import "AppController.h"

@implementation AppController

- (id)init
{
    self = [super init];
   
    curString = [[NSMutableString alloc] init];

    /* 목적어 데이터 설정 */

    dataArray[0][0] = [[NSString alloc] initWithUTF8String:"철수를"];
    dataArray[1][0] = [[NSString alloc] initWithUTF8String:"영희를"];
    dataArray[2][0] = [[NSString alloc] initWithUTF8String:"바둑이를"];
   
    /* 동사 데이터 설정 */
    dataArray[0][1] = [[NSString alloc] initWithUTF8String:"사랑했다"];

    dataArray[1][1] = [[NSString alloc] initWithUTF8String:"싫어했다"];
    dataArray[2][1] = [[NSString alloc] initWithUTF8String:"때렸다"];
   
    return self;
}

- (void)awakeFromNib
{
}

- (void)dealloc
{
    int i, j;
   
    /* 할당된 오브젝트 해제 */
    for(i = 0; i < 3; i++)
    {
        for(j = 0; j < 2; j++)
        {
            [dataArray[i][j] dealloc];
        }
    }
   
    [curString dealloc];
    [super dealloc];
}

- (IBAction)setDisplayText:(id)sender
{
    int pos = [wordList selectedRow]; // 테이블뷰에서 현재 선택된 열
    if(pos == -1) // 없으면 실행하지 않는다
        return;
   
    /** 조건에 따른 문자열 설정 */
    if([[subjectMatrix selectedCell] tag] == 0)
        [curString setString:[NSString stringWithUTF8String:"나는 "]];
    else
        [curString setString:[NSString stringWithUTF8String:"너는 "]];
   
    [curString appendString:dataArray[pos][0]];
    [curString appendString:@" "];
    [curString appendString: [adverbSelecter stringValue]];
       
    if([notChecker state] == NSOnState)
        [curString appendString:[NSString stringWithUTF8String:" 안 "]];
   
    [curString appendString:dataArray[pos][1]];
   
    /* 색상 설정 */
    [displayString setTextColor:[colorWell color]];
   
    /* 정렬 설정 */
    int align = [alignSlider intValue];

    if(align == 0)
        [displayString setAlignment:NSLeftTextAlignment];
    else if(align == 50)
        [displayString setAlignment:NSCenterTextAlignment];
    else
        [displayString setAlignment:NSRightTextAlignment];
   
    /* 텍스트 출력 */
    [displayString setStringValue:curString];
   
    /* 진행 상태바 에니메이션 중지 */
    [progressBar stopAnimation:self];

}

- (IBAction)adverbSelecterChanged:(id)sender
{
    /* 변경시 진행 상태바 에니메이션 시작 */
    [progressBar startAnimation:self];
}

- (IBAction)alignSliderChanged:(id)sender
{
    [progressBar startAnimation:self];
}

- (IBAction)notCheckerChanged:(id)sender
{
    [progressBar startAnimation:self];
}

- (IBAction)subjectMatrixChanged:(id)sender
{
    [progressBar startAnimation:self];
}

- (IBAction)colorWellChanged:(id)sender
{
    [progressBar startAnimation:self];
}

- (IBAction)wordListChanged:(id)sender
{
    [progressBar startAnimation:self];
}

- (int)numberOfRowsInTableView:(NSTableView *)tableView
{
    /* 테이블 열 갯수 3 반환 */
    return 3;

}

- (id)tableView:(NSTableView *)tableView
    objectValueForTableColumn:(NSTableColumn *)tableColumn row:(int)row
{
    int pos;

    /** 현재 설정되어야 할 TableView의 컬럼을 반환한다. */
    if([[tableColumn identifier] characterAtIndex:0] == '1')
        pos = 0;
    else
        pos = 1;
   
    return dataArray[row][pos];
}

@end


이제 빌드를 하고 실행 하시면 좌측과 같이 어플리케이션이 실행됩니다. 각각의 옵션을 선택하고 [적용] 버튼을 클릭하면 선택된 옵션에 맞추어 상단에 텍스트가 출력됩니다.

옵션에 변동이 일어나면 하단의 바가 에니메이션되며 [적용] 버튼을 클릭하여 적용이 완료되면 진행 상태바의 에니메이션이 중지 됩니다.

전체 프로젝트 소스파일은 아래를 클릭해서 다운로드 받이스면 됩니다.











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

댓글을 달아 주세요

아이폰기본사용2010. 6. 29. 10:50
PC Suite 기본 사용법

프로그램 명칭 : PC Suite (手机助手)

프로그램 성격

  • 기본적으로 아이튠스와 앱스토어를 합친 기능에 WinSCP 등의 파일 관리 기능까지 추가
  • 최신 버전에서는 Cydia 어플을 컴에서 설치하거나 소스 추가 등의 기능도 추가됨
  • 다양한 포맷의 어플을 직접 설치할 수 있음
  • 파일관리, 미디어 제작/컨버팅/관리, 통화목록, 연락처, SMS 등 다양한 부가기능
  • 아직까지 iPod과 연동 기능은 제공하지 않음
  • 빠른 업데이트 속도로 크랙어플을 소개하나 아쉽게도 중국어로만 제공 (파일명만 알면 설치는 가능)
  • 최근 영문 웹사이트를 통한 어플 설치도 서비스하고 있음

프로그램 다운로드 :


* BlackRa1n으로 탈옥 후 프로그램을 실행시키면 아래 그림처럼  "Jailbreak가 되지 않았다"는 메시지가 뜨는 데
   이 경우 여기를 참조하여 해결하세요.





기본 화면
 :

좌상단의 아이폰 모양 아이콘 메뉴를 클릭하면 아래 그림처럼 해당 언어를 선택할 수 있습니다.

아이폰과 연결
 : 프로그램 중간의 연결하기 혹은 우상단 부분을 클릭해서 USB 유선 연결 혹은 Wi-Fi를 통한 무선 연결 선택
                        (무선 연결 시 여기 를 참조)


기본 메뉴 설명

1. 상단메뉴

1.1. 시작(Start) : 아이폰 관련 최신 뉴스, 프로그램 정보 등


1.2. 관리(Management)
: 사진, 아이팟, 연락처, 문자내역, 캘린더, 메모, 전자책, 통화내역, 알람 등


아래 그림은 iPod 메뉴인데 아쉽게도 아직까지는 아이폰과 연동 기능을 제공하지 않고 있음
다만 중국의 구글인 Baidu라는 검색 사이트와 연동하여 음악을 바로 검색하고 무료로 다운 받을 수 있는 기능을 제공


1.3. 시스템(System) : 아이폰 문제 해결, 발송자 지역정보 조회, 파일 관리, 프로그램 관리, 백업/복원 등


1.4. 미디어(Media)
: 배경화면, 테마, 벨소리, 스샷, 벨소리 제작, 음악/동영상 컨버팅, RSS 피드 관리 등


1.5. 커뮤니티(Community)
: 제작사 소개, 아이폰 관련 블로그 등 링크


1.6. 갱신(Updates)
: 제작사 프로그램 업데이트 정보



2. 좌측메뉴
 : 상단 메뉴 중 제일 중요한 기능 등만 모아 놓은 곳

2.1. 파일(Files) : 아이폰에 직접 접속하여 파일 관리 및 테마 파일 등 설치 (WinSCP 등 대체, 계정/비번 필요 없음)


2.2. 어플(Apps) : 각종 어둠의 경로 어플 다운로드/설치/삭제, Cydia 어플 유선 설치, 소스 추가
                   (어플 설치는 여기 참조, Cydia 혹은 어플 수동 설치는 여기 참조)



2.3. 사진(Pictures): 아이폰 내  사진 및 스샷 관리


2.4. 문서(Docs)
: 아이폰에 직접 접속하여 My Documents 폴더를 관리


2.5. 채팅(Chat) : 컴에서 바로 문자 발송/수신 기능 제공 및 문자 내역 관리



2.6. 전원(Turn Off): 아이폰 리스프링/재부팅/전원끄기



세부 강좌 링크

PC Suite 한글화 파일

어플 설치 방법

Cydia 어플 유선 설치/소스 추가 및 다양한 포맷의 어플 직접 설치 방법

설치한 어플 보관 장소

벨소리 제작 및 적용 방법

아이폰용 동영상 제작 방법 (포맷 변환)

테마 적용 방법

배경 파일 제작 및 적용 방법

내 컴에서 아이폰에 무선 접속 방법

스샷 찍기

사진 관리 방법

컴에서 채팅하듯 문자 주고 받기

기존에 사용하던 스마트폰의 연락처 등 중요 데이터를  전송하는 방법
 


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

댓글을 달아 주세요

아이폰어플개발정보2010. 6. 24. 14:21
iPhone View Switching 을 위한 모달뷰(ModalView) 사용법
A 라는 뷰콘트롤러에서 B 라는 뷰콘트롤러의 뷰를 모달로 띄우고 싶을 때

방법1.
A 에서의 코드
- (IBAction)showModalview {
    ModalVWController *modalView = [[ModalVWController alloc] initWithNibName:nil bundle:nil];
    [self presentModalViewController:modalView animated:YES];

우후.. 쉽다.
닫을때는? 그건 B 에서 처리해줘야 한다. 이렇게
-(IBAction)closeView {
    [[self parentViewController] dismissModalViewControllerAnimated:YES];

음.. view 의 메서드를 이용하는 두번째 방법을 소개하면
방법2.
A에서의 코드
[[self view] addSubview:modalView.view];
그리고 닫을 때의 코드는
[[self view] removeFromSuperview];
이다.



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

댓글을 달아 주세요

아이폰어플개발정보2010. 6. 24. 14:21
iPhone Tutorial - TouchXML 사용법
TouchXML 을 사용하기 위해서는 프로젝트에 TouchXML 라이브러리를 추가해야 한다.
방법은..
1. TouchXML 소스를 프로젝트에 추가한다. 다운로드
2. TouchXML 은 lib2 를 사용하기 때문에 이를 프로젝트 콘피그에 설정해줘야 한다.
  • Setting 항목의 Search Paths 그룹의 Header Search Paths에 /usr/include/libxml2 값 설정.
  • Setting 항목의 Linking 그룹의 Other Linker Flags에 -lxml2 값 설정


이제 코딩으로 들어가보자.
사용하기 위해 임포트 먼저 하고
#import "TouchXML.h"

그리고 XML 파일을 읽어야겠지?
- (IBAction)doTouchXML {
   
    NSBundle* bundle = [NSBundle mainBundle];
    NSString* strXMLFIlePath = [bundle pathForResource:@"book" ofType:@"xml"];
    NSData *ndXMLFromFile = [[[NSData alloc] initWithContentsOfFile:strXMLFIlePath] autorelease];
   
    CXMLDocument *xmlParser = [[[CXMLDocument alloc] initWithData:ndXMLFromFile
                                                          encoding:NSUTF8StringEncoding options:0 error:nil] autorelease];

    NSArray *arrXmlNode = [xmlParser nodesForXPath:@"//book" error:nil];
    NSLog(@"BOOK COUNT: %d", [arrXmlNode count]);

CXMLDocument 객체를 이용해서 XML 파일을 읽어들이고 있다. 그리고는
XPathQuery 를 날려서 이를 배열로 받는데 각 배열안에 들어있는 오브젝트는 CXMLElement 이라는 자료형이다.




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

댓글을 달아 주세요

아이폰기본사용2010. 6. 21. 23:53
기타 아이폰 팁 사용법
  • 핸드폰을 Unlock하지 않는 상태에서 홈버튼을 두번누르면 뮤직 플레이어가 상단에 뜬다. 그러면 Unlock을 하지 않고도 음악을 들을 수 있다.
  • 계산기를 세로로 하면 일반 계산기 기능이고, 아이폰을 가로로 누이면 공학용 계산기로 바뀌는것은 다 아는 사실
  • General Setting에서 Home Button 셋업을 어떻게 하느냐에 따라 홈버튼을 두번 누르면 Phone Favorites, Home, 또는 iPod로 바로 이동한다.
  • Settings --> Phones로 이동하면 Show My Caller ID라는 메뉴가 있는데 이 메뉴를 Off 시키면 상대방이 내 전화번호나 ID를 읽을 수 없다. 상대방 전화에는 전화번호나 이름이 나오는대신에 'Blocked" 또는 "Private Call"과 같은게 뜬다.
  • 이메일이나 메모패드에서 타자를 칠때 영문 대문자로 2-3자 이상을 계속해서 칠 경우가 종종 생기는데 (예를들면 SBS, TV등) 멀티터치를 지원하는 아이폰이기에 대문자를 사용하는 Shift 키(윗화살표 모양)를 누른 상태에서 영문을 치면 계속해서 대문자를 칠 수 있다.
  • 전화가 울릴때 받고 싶지 않고 바로 Voicemail로 보낼려면, Sleep&Wake 버튼을 두번 누르면 음성사서함으로 바로 넘어간다.


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

댓글을 달아 주세요

아이폰기본사용2010. 6. 21. 23:53
빨리감기 및 되감기 기능 사용법
빨리감기, 되감기 기능
아이폰에서 음악을 들을때 하단 플레이어 버튼들을 보면 플레이/정지 버튼과 다음곡, 이전곡 버튼이 있는데 다음곡버튼을 누르고 있으면 다음곡으로 넘어가는것이 아니라 빨리감기 기능이 된다. 이전곡도 마찬가지로 한번 터치하는것이 아니라 꼭 누르고 있으면 뒤로 빨리감기 기능이 된다. (이것도 많은 사람들이 다 아는 기능)


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

댓글을 달아 주세요

XCODE2010. 6. 21. 18:29
NSNumber, NSMutableArray 초기화 및 사용법


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

댓글을 달아 주세요