태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

2012/07/05: Hello world in xcode

Daily life/Hard study 2012.07.05 22:50

1. 일단 화면에 hello world을 출력하는 간단한 앱을 만들어보자.

2. 텍스트를 입력받고 버튼을 누르면 뒤집힌 텍스트를 출력하는 앱으로 업그레이드 해보자.

-----

Create new project를 누르면 application 타입을 물어본다. 뭐 이런 것들이 있다:
  Master-detail
  OpenGL
  Page-based
  Single view
  Tabbed
  Utility
  Empty

일단 헤딩이니까 Empty로 해보자
  project name: helloworld
  company name: dgoon
  class prefix: DGOON
  - 헐 자동으로 local git 저장소를 만드네?

프로젝트 생성하고 그냥 실행을 하면 (enable developer mode? 를 물어본다)
  run/stop 버튼 오른쪽에 target device를 설정할 수 있는 select box가 있다. ipad는 너무 크니까 iphone 으로 한다
  실행하면 아무것도 없는 하얀 화면이 나옴

프로그렘 진입은 main.m 파일이다. 하는 일은 UIApplicationMain 클래스를 만드는 것 뿐이다.

-> UIKIT_EXTERN int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);

DGOONAppDelegate 가 결국에는 모든 일을 다 하는 녀석인데, 이는 DGOONAppDelegate.h/m 파일에 있다.
결국 우리는 UIAppilcationDelegate를 상속받아 클래스를 만들어서 UIApplicationMain에게 던져주면 되는것이다!

DGOONAppDelegate.m 을 보면 몇 개의 함수들이 정의되어 있다.

  didFinishLaunchingWithOptions
 applicationWillResignActive
 applicationDidEnterBackground
 applicationWillEnterForeground
 applicationDidBecomeActive
 applicationWillTerminate

이름을 보면 하는 일들은 명확하다. 각 함수 안에 있는 주석을 읽으면 도움이 되겠지.
나는 didFinishLaunchingWithOptions 에서 화면에 helloworld만 찍어주면 된다.

didFinishLaunchingWithOptions 함수를 보면 self.window 를 만든 다음에 makeKeyAndVisible 을 불러준다.
검색해보니 key window 란 입력 이벤트를 받는 윈도우다. 즉, 화면에 보이게 하고 터치나 키 입력 등의 이벤트를 저 윈도우로 받게 세팅하는 것이다.

self.mytext 를 만들어서 저기에 "helloworld" 를 넣은 후에 보이게 하면 될것같다.

self.window 는 DGOONAppDelegate.h 에 선언되어 있는데,

@property (strong, nonatomic) UIWindow *window;

이런 모양이다. property 를 좀 검색해서 찾아보았다. http://maclove.pe.kr/28 이 문서에 나름 잘 설명되어 있는듯. …
그런데 strong 에 대한 설명은 없다! 검색해보니 최근에 추가된 것 같은데 retain 의 대체이며, reference counting 에 관련된 속성이라 한다.

헤더(.h)에는 이렇게:

@property (strong, nonatomic) UITextView *mytext;

구현(.m)에는 이렇게:

@synthesize mytext = _mytext;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

    self.window = [[UIWindowalloc] initWithFrame:[[UIScreenmainScreen] bounds]];

    // Override point for customization after application launch.

    

    self.mytext = [[UITextViewalloc] initWithFrame: CGRectMake(100, 100, 200, 200)];

    self.mytext.text = @"HelloWorld!";
    [self.window addSubview:self.mytext];

        

    self.window.backgroundColor = [UIColor whiteColor];

    [self.window makeKeyAndVisible];

    returnYES;

}


추가하였다. cmd+b 로 빌드는 성공. cmd+r 로 실행해보면 옆으로 누워있는 아이폰에 HelloWorld! 라고 쓰여있는게 보인다.
cmd+방향키로 오른쪽 왼쪽으로 돌릴 수 있다. textview는 기본적으로 수정 가능한가보다. 클릭을 하면 키보드가 뜨고
키입력을 하면 뭔가 써 넣을 수도 있고, select, copy 등도 가능하다. 수정 못하게 해보자.

    [self.mytext setEditable:false];

mytext생성 후에 이렇게 한줄 넣어주면 된다. xcode의 자동완성이 아주 도움이 많이 된다. 있을법한 이름을 때려 넣으니까 나온다.
수정은 불가능한데 여전히 select, copy 등은 가능하다. 이것도 막고 싶은데 setSelectable 은 없는 듯 하다. 나중에 찾아본다. …

helloworld 찍는 앱 완성.

-----

2번으로 넘어가기 전에, 테스트를 좀 해보자. self.mytext 에 스트링을 바꿔 넣으면 바로 반영이 되는가?
applicationDidEnterBackground 함수에 아래와 같이 한 줄을 넣으면,

    self.mytext.text = @"enter background!";

처음 실행할 때에는 HelloWorld! 가 보이고, 홈버튼을 누른 후에 다시 아이콘을 클릭하면 enter background! 로 텍스트가 바뀐다.
그런데, 다시 시작하니까 화면이 누워있다. 이거 기본 로테이션을 바꿀 수 없나?

왼쪽 project tree view의 루트를 클릭하고,  Target Helloworld -> Info -> Supported interface orientations 에서 item 0/1/2 순서를 바꿔주면 된다. Portrait를 0번으로 놓았다.

-----

2번을 위해서는

  a. UITextView 2개를 넣어서 하나는 입력(a), 하나는 출력(b)에 쓴다.
  b. UIButtonView (가 있나?) 를 만들어서 콜백함수를 작성 -> 자동완성을 보니 UIButton 이 나온다.
  c. 버튼의 콜백함수에서 (a)를 읽어 뒤집은 후 (b)에 넣는다.

를 하면 된다. 수정해보자.

위에서 추가했던 mytext 를 지우고, 대신 이런 아이들을 넣는다.

.h ->

@property (strong, nonatomic) UITextView *input_text;

@property (strong, nonatomic) UITextView *output_text;

@property (strong, nonatomic) UIButton *reverse;

.m ->

@synthesize input_text = _input_text;

@synthesize output_text = _output_text;

@synthesize reverse = _reverse;


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

    self.window = [[UIWindowalloc] initWithFrame:[[UIScreenmainScreen] bounds]];

    // Override point for customization after application launch.

    

    self.input_text = [[UITextViewalloc] initWithFrame: CGRectMake(100, 100, 100, 20)];

    self.input_text.text = @"INPUT";

    [self.input_textsetScrollEnabled:false];


    self.output_text = [[UITextViewalloc] initWithFrame: CGRectMake(100, 200, 100, 20)];

    [self.output_textsetEditable:false];

    [self.output_textsetScrollEnabled:false];

    self.output_text.text = @"OUTPUT";

    

    self.reverse = [UIButtonbuttonWithType: UIButtonTypeRoundedRect];

    self.reverse.frame = CGRectMake(100, 150, 100, 20);

    [self.reversesetTitle:@"REVERSE!"forState:UIControlStateNormal];

    [self.reverseaddTarget:selfaction:@selector(reverse_output) forControlEvents:UIControlEventTouchUpInside];

    

    [self.windowaddSubview:self.input_text];

    [self.windowaddSubview:self.output_text];

    [self.windowaddSubview:self.reverse];

        

    self.window.backgroundColor = [UIColorwhiteColor];

    [self.windowmakeKeyAndVisible];

    returnYES;

}


- (void)reverse_output

{

    self.output_text.text = @"CLICKED!";

}

이렇게 하면 버튼을 눌렀을 때 output_text 가 CLICKED! 로 바뀌는 화면이 만들어진다.
여기서 reverse_output 을 수정해서 입력 텍스트를 뒤집게만 하면 된다. 일단 NSString 에 reverse 메소드가 있는지 확인을 해본다.
없다. … 검색을 해보니 … … ?? 뭐 이리 복잡해 으아앙 멘붕.

그냥 파일 이름을 DGOONAppDelegate.mm 으로 바꾸고 제일 위에

#include <algorithm>

#include <string>

using namespace std;

이걸 추가하고 나서 reverse_output 을 아래와 같이 고쳐버렸다. … C++이 최고다. orz

- (void)reverse_output

{

    std::string s([self.input_text.textUTF8String]);

    std::reverse(s.begin(), s.end());

    self.output_text.text = [NSStringstringWithUTF8String: s.c_str()];

}

이게 한글, 일본어같은 문자열에 대해서는 (당연히) 동작을 안할텐데 일단 이렇게 놓고 오늘은 끝.
어떻게 해야 쉽고 안전하고 이식성 있게 뒤집을 수 있는가!?


'Daily life > Hard study' 카테고리의 다른 글

MongoDB 읽고쓰기  (6) 2012.07.26
도깨비(tokebi) 더미 API  (5) 2012.07.12
2012/07/05: Hello world in xcode  (5) 2012.07.05
An introduction into SICP  (6) 2011.09.03
Reading: How To Design Programs(HTDP)  (0) 2011.07.13
D 프로그래밍 언어 - 오타(?)  (3) 2011.05.12
Trackbacks 0 : Comments 5
  1. Favicon of http://rein.kr rein 2012.07.05 23:56 Modify/Delete Reply

    utf-32 에서 뒤집으시면 (도망간다)

  2. haru 2012.07.06 13:42 Modify/Delete Reply

    이미 찾아보신 방법인지는 모르겠지만...

    기본적으로 NSString은 immutable 이기 때문에 in-place로 뒤집는 것은 안되고, 다른 스트링으로 뒤집힌 결과를 저장하되 루프를 사용하지 않는 방법을 찾아봤습니다.

    NSString *s = @"헬로우월드";
    NSMutableString *rs = [NSMutableString stringWithString:@""];
    NSRange fullRange = [s rangeOfString:s];
    NSStringEnumerationOptions enumerationOptions = (NSStringEnumerationReverse | NSStringEnumerationByComposedCharacterSequences);
    [s enumerateSubstringsInRange:fullRange
    options:enumerationOptions
    usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL * stop){
    [rs appendString:substring];
    }];

    http://stackoverflow.com/questions/4989562/print-reverse-of-a-string
    (이글의 마지막 답변이 제가 사용한 방법입니다.)

    참고로 lambda와 유사한 기능을 objective-c에서는 block이란 이름으로 제공합니다. 위 enumerateSubstringsInRange:options:usingBlock: 에서 마지막 인자로 사용한 것이 block 입니다.

    일하기 싫으니까 이런 거나 찾아보고 있고... ;;; 근데 어인일로 xcode를...

    (comment는 indent가 안 먹네요 ㅠㅠ)

    • dgoon 2012.07.06 11:08 Modify/Delete

      네, 저거 찾아보고 멘붕왔어요. 으흑으흑 ㅠㅠ
      xcode는 그냥 다시 손대봤어요.
      전에 배워둔게 쪼끔은 있어서 어떻게든 혼자 삽질할 만은 하네요. ㅎㅎㅎ

  3. Favicon of http://15481hiphopweekly.com/html/lv_p2.html louis vuitton outlet 2013.07.15 06:06 Modify/Delete Reply

    다른 남자 부르면서 울거면 나한테 이쁘지나 말던지

  4. Favicon of http://7451taxfreebicycle.com/lvus.php louis vuitton outlet 2013.07.16 09:24 Modify/Delete Reply

    좋으면 좋고 싫으면 싫은 거지, 뭐가 이렇게 어렵고 복잡하냐구

Write a comment