블로그 이미지
'무른모'란 부드럽다라는 뜻을 가진 '무르다'라는 말과 도구, 연장을 뜻하는 '연모'라는 순 우리말의 합성어로 소프트웨어를 말합니다. seanhigher

카테고리

분류 전체보기 (161)
Blog srart (16)
Dev Center (94)
Real Life (13)
Mac life (21)
Naver life (17)
Total652,955
Today8
Yesterday77

'애플리케이션'에 해당되는 글 3건

  1. 2010.06.22 입맛대로 골라쓰는 유틸. 탭바!
  2. 2010.04.19 델리게이트는 무엇일까?
  3. 2010.04.12 키보드로 입력해 보자!
유틸리티어플리케이션의 경우는 두개의 화면만으로는 부족한 경우가 많다. 다양한 화면의 선택의 폭을 넓혀주는 것이 있는데, 그것이 탭바 어플리케이션이다.


TabBar 어플리케이션.
Xcode를 실행하고 새로운 프로젝트를 생성한다. 프로젝트 템플릿은 탭바 어플리케이션으로 선택하도록 한다.


그림1. 새 프로젝트

Xcode가 실행되고 'Resource' 폴더를 보면 'MainWindow.xib' 와 'SecondView.xib' 의 두개의 파일이 있는 것을 볼 수가 있다. 첫번째것은 탭바와 첫번째 화면을 나타낸다. 두번째는 두번째 탭을 선택했을때 나타나는 화면을 나타낸다. Xcode에서 이것을 그대로 실행하면 다음과 같이 실행되는 것을 볼 수 있다.


그림2. 탭바 어플리케이션 실행.

첫번째 탭과 두번째 탭을 번갈아가면서 눌러보면 화면이 바뀌는 것을 볼 수 있을 것이다. 각가의 화면들을 변경하기 위해서 Xcoed 로 돌아와서 'MainWindow.xib' 파일을 더블클릭하여 인터페이스 빌더를 실행시킨다. 첫번째 탭의 선택화면을 변경하고 싶다면 첫번째 'MainWindow.xib' 파일을 변경하면 되고, 두번째 탭의 화면을 변경하고 싶다면, 'SecondView.xib' 파일을 수정하면 된다.


더 많은 탭바 추가하기.
단 두개의 화며으로 이루어진 탭바는 그렇게 유용하게 쓰일 수 없다. 단 두개의 화면이라면 유틸리티 윈도우가 훨씬 멋있게 나타나고 공간도 더 넓게 사용할 수 있는 이점이 있기 때문이다. 하지만 탭바를 사용하는 이유는 바로 그것 때문이다. 더 많은 메뉴를 추가하는 것이 가능하다는 것이다! 메뉴에서 'File' -> 'New File'을 차례로 선택하여 새로운 파일을 생성하도록 한다. 파일형식은 'Cocoa Touch Class' 에서 'UIView Controller subclass'을 선택한다. 여기서 기억해야 할것은 아래의 체크박스중에서 'With XIB for user interface' 에 체클를 하고 파일을 생성해야 한다는 것이다.


그림3. 새로운 파일 생성


파일의 이름을 정하고 'finish' 버튼을 누르면 똑같은 파일명으로 '.h' '.m' '.xib' 세개의 파일이 생성되는것을 볼 수 있다. 각각의 파일이 생성된것을 확인한 후 'MainWindow.xib'파일을 인터페이스 빌더로 실행한다. 그리고 main 윈도우에서 'TabBarController'를 선택하고 Attribute 창을 실행시키도록 한다.


그림4. 탭바 Attribute 항목

애트리뷰트 항목의 맨 윗 부분을 보면 두개의 탭 항목이 있는 것을 볼 수 있다. '+' 버튼을 눌러서 항목을 추가할 수 있다. 여러개의 항목이 필요하다면 더 많이 추가하는 것이 가능하다. 많은 항목을 추가하면 그 갯수만큼 새 클래스 파일을 생성해주어야 한다. 탭바의 항목을 추가하면 main 윈도우에 컨트롤러 항목이 두개에서 더 늘어난 것을 볼 수 있다.


그림5. 탭바 항목 추가

main 윈도우에 새로 추가된 항목을 선택하고 애트리뷰트창을 띄운다. 항목을 보면 NIB name 이라는 것이 있는데 이것을 아까 새로 만들었던 파일의 이름을 선택하도록 한다. 그리고 아이덴티티창으로 이동한 후 class 를 동일한 이름으로 바꾸어준다. View 화면에서 세번째 탭을 선택했을때 다음과 같은 화면이 나온다면 제대로 설정이 된 것이다.


그림6. 세번째 탭바 항목 추가.

위의 그림에서 파란색 'thirdView'의 이름의 세번째라서 그렇게 나오는것이 아니라 파일명을 그렇게 생성했기 때문에 그렇게 나오는 것이다. 다른이름으로 클래스를 생성했다면 다른 이름으로 되어 있을 것이다. 세번째의 화면을 수정하고 싶다면 파란색 링크를 클릭하여 나오는 '뷰'를 수정하면 된다. 만일 나오지 않는다면 이름을 잘못 입력했을 가능성이 크므로 다시 처음부터 천천히 해보길 바란다.


그림7 실행 화면

이제 실행을 하면 세개의 탭으로 된 탭바 애플리케이션을 볼 수 있을 것이다. 이제 좀더 많은 메뉴를 가진 에플리케이션을 만들 준비가 되었다.

Posted by seanhigher

댓글을 달아 주세요

Object-C 프로그래밍에 있어서 델리게이트는 매우 중요한 요소라고 할 수 있다. 게다가 이 델리게이트는 아이폰 애플리케이션의 생명주기와도 깊은 연관이 있다. 델리게이트가 없다면 생명을 잃어버린 애플리케이션이라고 말 할 수 있다.



애플리케이션의 생명주기.
어떤 프로그래밍 언어이든지, 프로그램이 소스 코드를 통하여 메모리에 적재되고, 각자 정해진 위치에서 역할을 수행하고, 필요가 없어졌을 때 메모리에서 사라지는 생명주기 싸이클이 존제한다. 아이폰 프로그램에서도 예외라고 할 수는 없다.


그림1. 아이폰 애플리케이션 생명주기.

애플리케이션의 생명 주기는 실행과 종료 사이에 발생하는 순차적인 이벤트들을 만들어낸다. 사용자는 아이폰 스크린의 아이콘을 선태하여 애플리케이션을 실행하게 된다. 이후에 시스템은 진행 상태를 보여주고 애플리케이션의 main 함수를 호출한다. 이 순간부터 초기화를 위한 작업들이 UIKit으로 넘어오는데, 애플리케이션의 UI를 불러오고 이벤트 루프를 준비한다. 이벤트 루프 과정에서 UIKit은 커스텀 객체로의 이벤트 전달과 애플리케이션에서 발생한 명령들을 처리하는 것을 조절하게 된다. 사용자가 프로그램을 종료하는 액션을 취하게 되면, UIKit을 통해서 애플리케이션에 알리고 종료가 진행된다.


애플리케이션 델리게이트.
애플리케이션 델리게이트(application delegate) 객체의 역할은 애플리케이션의 동작을 모니터링 하는 것이다. 델리게이트라함은 위임이라는 뜻을 가지고 있는데, 의미 그대로 메소드의 역할을 위임하는 것이라고 할 수 있다. 변수의 경우, 각 변수가 가지고 있는 값들을 어떤 특졍한 패턴, 함수에의해 변형되어, 개발자의 의도대로 결과 값을 얻을 수가 있다. 이런 특징적인 역할을 하는 함수(모듈, 객체, 메소드라고 정의할 수 있는)들을 특정한 조건이나, 의도를 가지고 묶음으로 만들어내 좀더 간편하게 사용하도록 하는 것이 델리게에트를 사용하는 목적이라고 할 수 있다. 또 한가지 델리게이트를 사용하는 이유는 UIApplication 과 같은 복잡한 객체를 상속하는 것을 피하고, 메소드를 재정의 하지 않음으로써 좀더 객체 지향적인 프로그래밍을 할 수 있도록 도와주게 된다.


그림2. 액션과 각 객체의 실행.

애플리케이션이 어떠한 액션을 만났을때, 그 액션에 맞는 객체의 메소드가 실행이 되게 된다. 이 객체는 객체에서 정의된 액션에 대해서만 행동을 하게 된다. 다양한 액션을 받아들이기 위해서는 그 액션에 대해서 정의를 해 주거나, 그 액션을 가지고 있는 상위 클래스를 상속 받아야 한다. 위 그림에서 action A 를 받아서 행동할 수 있는 것은 object A 뿐이다. action B 는 object B, action C 는 object C 로만 반응이 가능하다. 만약 action A 를 실행해야 하는 상황에서 action B 가 발생을 한다면 object A 는 적절한 대응을 할 수가 없다. action B 에 대응하기 위해서는 object B 가 상속받은 클래스를 동일하게 상속받아야 한다.


그림3. 델리게이트를 통한 확장.

이런 불필요한 자원의 낭비를 줄여주는 것이 델리게이트이다. 델리게이트는 메소드와 메소드를 이어주는 연결고리라고 할 수 있다. 필요한 메소드를 상속을 통한 확장이 아니라, 연결의 의미에서 전달만 하게 된다. 위의 그림처럼 action A, B, C 를 따로 따로 정의해서 사용하는 것이 아닌, object A, B, C 를 하나로 묶어주고, 연결해 줌으로써 좀더 다양한 action에 대응할 수 있는 유연성을 제공한다. 불필요한 상속을 줄여주는 것이다.


델리게이트의 선언.
델리게이트는 다음과 같이 선언되고, 사용할 준비가 된다.

ProjectNameViewController.h 파일
@Interface ProjectNameAppDelegate : NSObject <UIApplicationDelegate> {
        UIwindow *window;
        ProjectNameController *viewController;
}


ProjectNameViewController.m 파일
- (void)applicatoinDidFinishLaunching: (UIApplication *)application {
        // TODO something
}


델리게이트는 아이폰 프로그래밍에 있어서 뿐만아니라, 객체지향 프로그래밍에 있어서 중요한 요소임에 분명하다. 그 개념이 쉽게 이해가 되지 않을 수 있겠지만, 꼭 이해하고, 사용할 줄 알아야 한다.

Posted by seanhigher

댓글을 달아 주세요

다양한 애플리케이션을 사용하는데 있어서 중요한 요소중의 하나는 어떠한 정보를 입력하느냐이다. 특히 스마트폰 같이 작은 크기 때문에 키보드 같은 물리적 입력도구를 갖지 못하는 경우에는 더욱 더 신중하게 다루어야 하는 요소이다. 아이폰에서는 몇가지 종류의 키보드를 제공하고 있다. 영어, 한글, 숫자, 특수문자등의 필요에 따라 원하는 키보드를 호출하여 사용이 가능하다.


New Project.
새로운 프로젝트를 시작한다. 'View-based Application' 을 선택하고 프로젝트 이름은 'keyBoard' 로 하였다. 이번에 만들게 될 애플리케이션에는 이미지와 여러개의 라벨, 키보드로 입력이 가능한 텍스트 필드 몇개가 있는 프로젝트이다. 여기서 설명하는데로 따라해도 괜찮지만, 각자 새로운 형태의 구성을 해보는 것도 괜찮다.


그림1. 애플리케이션 구상

그림과 같이 각 영역을 구분지어보고, 각 영역별로 어떤 기능을 담당하게 할 것인가에 대해서 생각해 보아야 한다. 처음에 있는 이미지 영역은 단순히 이미지를 나타내기만 한다. 오른쪽의 텍스트 영역 역시 별다른 수정이나 변화가 필요하지 않다. 이제 아래에 있는 영역들을 보면, 'Name : ' 와 'Anumber : ' 는  텍스트필드 영역에 어떤 내용이 들어가야 하는지에 대해서 설명을 해주기 때문에 별 다른 변화가 필요하지 않다. 오른쪽 아래의 텍스트 필드 영역은 실제적으로 이름과, 군번(Anumber) 가 들어가는 자리이다. 이 영역에는 뭔가 입력을 받고, 데이터를 저장하는 등의 상호작용을 위한 부분이 되는 것이다. 이렇게 구성을 확인해 보면, 아웃렛이나, 액션이 선언되어야 하는 부분이 확실해 질것이다.


아웃렛 선언하기.
아웃렛을 선언해야 하는 부분은 두개의 텍스트 필드 영역이다. 아웃렛을 선언하기 위해서는 뷰컨트롤러.h 파일에 @property를 선언하고, 뷰컨트롤러.m 파일에 @synthesize 를 선언해 주면 된다.


그림2. keyBoardViewController.h 파일 수정

아웃렛을 선언하려는 부분의 프로퍼티를 선언한다. 프로퍼티를 선언하는 것은 다음과 같이 형식을 취하여 선언하면 된다. (굵은 글씨의 부분을 추가)

@interface keyBoardViewController : UIViewController {
    UITextField *nameField;
    UITextField *AnumberField;
}
@property (nonatomic, retain) IBOutlet UITextField *nameField;
@property (nonatomic, retain) IBOutlet UITextField *AnumberField;
@end


그림3. keyBoardViewController.m 파일 수정

헤더파일에 아웃렛을 선언한 후에 뷰컨트롤.m 파일에 @synthesize 선언자를 통해 선언을 해 주어야 접근자 메소드와, 변경자 메소드가 생성된다.

@implementation keyBoardViewController
@synthesize nameField;
@synthesize AnumberField;

또한, 메모리에 관련한 부분도 잊어서는 안된다. 아이폰 처럼 매우 적은 메모리를 사용하는 기기일 수록 메모리가 낭비되는 일이 없도록 꼼꼼하게 프로그래밍을 해야 한다. retain 키워드를 사용해 선언한 변수들을 모두 release 해주어야 한다.

- (void)dealloc {
    [nameField release];
    [AnumberField release];
    [super dealloc];
}


이미지 추가하기.
아이폰 프로그래밍에서 이미지를 사용하기 위해서는 'Groups&Files' 창의 'Resource' 폴더에 포함되어 있어야 한다. 아이폰에서 보여주고자 하는 작은 크기의 이미지로 작업을 해야 아이폰에서 이미지 크기를 변경하는 불필요한 연산을 줄일 수 있다. 사용하고자 하는 파일을 파인더에서 'Resource' 폴더로 끌로와서 포함을 시키거나, 'Resources' 폴더의 우클릭 메뉴에서 'Add' -> 'Existing Files...'을 해서 이미지 파일을 추가할 수 있다.


그림4. 이미지 파일 추가.


화면 디자인 하기.
'Resources' 폴더의 'keyBoardViewController.xib' 파일을 더블클릭하여 인터페이스 빌더를 실행한다. 먼저 이미지를 추가하기 위해서는 라이브러리 윈도우에서 'Image View' 를 드래그 해서 View 윈도우에 놓아야 한다.


그림5. 이미지 뷰 추가.

위의 화면과 같이 꽉 찬 화면의 이미지뷰가 뷰 윈도우에서 선택되어 진 것을 볼 수 있을 것이다. 하지만 우리가 넣고자 하는 이미지는 아직 들어가 있지 않다. 이미지뷰는 이미지의 영역을 구분하는 경계정도로 생각하면 된다.


그림6. 실제 이미지 표현

실제로 이미지가 나타나게 하기 위해서는 Attribute 윈도우의 'Image' 에 이미지 파일을 추가해 주어야 한다. 드롭다운 선택 메뉴가 나오는데, 여기에는 'Resource' 폴더에 포함된 이미지들만 나오게 된다. 여기서 원하는 이미지를 선택하면 위의 그림과 같이 이미지가 뷰에 표현되는 것을 볼 수가 있다. 간혹 실제 이미지를 표현하기 전에 이미지 영역이 뷰 영역의 뒤로 표현이 되서 선택을 못하는 경우가 발생하는데, 이럴 경우에는 main 윈도우의 View Mode 를 리스트 보기로 바꾸면 뷰영역안에 포함되어 있는 목록을 볼 수 있다. 여기에서 이미지 뷰 영역을 선택하면 뷰 윈도우에서도 똑같이 선택할 수 있다.


그림7. main 윈도우 리스트로 보기

이미지를 이미지 뷰 위에 올려놓은 후에는 이미지와, 이미지뷰의 크기를 똑같이 하는 작없이 필요하다. 이는 자원의 낭비를 줄이는 것도 되겠지만, 이미지 뷰 영역 자체가 하나의 영역으로 작용하기 때문에, 다른 영역과 겹칠 수 있는 가능성을 없애고, 이미지 외 별도의 효과를 주는 것을 피하기 위해서이다. 이미지 영역을 맞추기 위해서는 '사과키' + '=' 을 누르거나 메뉴에서 'Layout' -> 'Size to Fit' 을 선택하면 된다. 이미지에 대한 작업을 마치고, 라벨을 적당한 위치에 배치하고, 내용을 변경하여 구상했던 모양대로 인터페이스를 구성한다.


그림8. 라벨, 텍스트필드 인터페이스 디자인

이미지와 라벨, 텍스트 영역을 이리저리 움직이다보면 나타나는 가이드 라인을 이용하면 어색하지 않은 인터페이스를 구성할 수 있을 것이다. 각 라이브러리 별 인스펙터도 하나하나 변경해보며 어떤 기능들이 있는지 확인해 보는 것도 재밌는 경험이 될 것이다. 텍스트 필드의 애트리뷰트 중에서는 사용자의 입력의 편의를 위해서 몇가지 주의를 해야 할 항목들이 있다. 먼저 'Clear When Editing Begins' 의 체크박스는 사용자가 텍스트 필드를 선택할때 기존에 있던 내용을 지우고 새로 시작할 것인지를 설정하게 된다. 체크를 해 놓으면 기존의 있던 내용이 텍스트 필드를 선택할 때마다 지워지고, 체크를 해제하면 기존의 내요이 유지가 된다. 보통은 체크를 해제하여 사용하도록 한다. 'Adjust to Fit' 체크박스는 입력하고자 하는 내용이 텍스트 필드의 크기보다 커질 경우 글씨의 크기가 줄어드는데, 줄어드는 정도의 최소 크기를 정하는 것이다. 체크를 해 놓으면 정해진 만큼 이하로는 글씨의 크기가 작아지지 않는다. Keyboard 메뉴는 입력하고자 하는 내용에 맞는 적절한 키보드가 나타나도록 한다. Name 필드 같이 이름을 입력할 경우에는 텍스트로 되어 있기 때문에 일반적인 키보드를 불러내도 상관없지만, Anumber 필드 같이 숫자만 입력하는 필드 같은 경우는 문자대신 숫자로만 이루어진 키보드가 적절하다. 이럴땐 팝업 메뉴에서 'Number Pad' 를 선택하면 숫자로만 이루어진 키보드가 나타나게 된다.


아웃렛 연결하기.
인터페이스를 완성하였다면 아웃렛을 연결해 주어야 한다. main 윈도우의 'File's Owner' 아이콘에서 'ctrl' 키를 누른채 아웃렛이 선언되어 있는 텍스트필드로 끌어주면 아래와 같은 팝업메뉴가 나오고, 텍스트필드에 맞게 선택해 주면 된다.


그림9. 아웃렛 연결

아웃렛을 연결하는 작업까지 마무리 지었다면 모든 과정이 일단은 마무리 되었다. 빌드를 하고 실행을 해보고 멋들어진 애플리케이션의 모습을 보도록 하자.


그림10. 애플리케이션 시뮬레이터.

그림과 글씨가 보이고 뭔가 있어보이는 듯한 애플리케이션을 완성하였다. 텍스트 필드를 클릭하면 텍스트와 숫자를 입력할 수 있는 키보드도 나타나게 된다. 하지만... 뭔가 생각지 못했던 문제가 있다.


키보드 사라지게 하기.
텍스트 필드에 문자를 입력하고난 후 키보드가 사라지지 않는 것이다. 입력을 마쳐도 마쳤다는 신호를 보낼 수가 없다. 어떻게 사라지게 할 수 있을까? 상식적으로 생각을 해보면 된다. 우리가 모든 입력을 마친후 마침을 의미하는 'return' 키를 입력하게 되는데, 아이폰에서도 'return' 키를 입력하였을때 키보드가 사라지도록 만들면 된다. 키보드 화면에서 'return' 키를 입력하게 되면 'did end on exit' 이벤트가 생성되는데 이 이벤트가 발생함과 동시에 텍스트 필드에 대한 입력이 더이상 이루어지지 않도록 하면 된다. 컨트롤러에 액션 메소드를 추가하려면 'keyBoardViewController.h' 파일에 다음의 코드를 추가해 넣으면 된다.

@interface keyBoardViewController : UIViewController {
    UITextField *nameField;
    UITextField *AnumberField;
}
@property (nonatomic, retain) IBOutlet UITextField *nameField;
@property (nonatomic, retain) IBOutlet UITextField *AnumberField;
- (IBAction) textEndReturn: (id)sender;
@end

그리고 'keyBoardViewController.m' 파일에 '(IBAction)' 액션 메소드를 구현하는 코드를 추가한다.

@implementation keyBoardViewController
@synthesize nameField;
@synthesize AnumberField;

- (IBAction) textEndReturn: (id)sender {
    [sender resignFirstResponder];

}


메소드를 구현하는 코드는 특별히 정해진 위치는 없기 때문에 적당한 위치에 입력하도록 한다. 이 메소드는 퍼스트 리스폰더의 상태에서 물러나게 된다. 텍스트를 입력하기 위해 텍스트 필트를 선택하면 텍스트 필드가 현재 실행하고 상호작용하고 있는 컨트롤을 의미하는 '퍼스트 리스폰더'의 상태를 가지게 된다. 그리고 동시에 텍스트를 입력할 수 있는 키보드가 나타나게 된다. 이때 키보드의 'return' 키를 눌러 퍼스트리스폰더 상태에서 물러나게 되는 액션이 실행되면, 더이상 텍스트 필드를 선택한 상태에 머무르지 않게 되는 것이다.


키보드 사라지는 액션 연결하기.
액션을 정의한 후에는 실제적으로 작동을 할 수 있도록 인터페이스 빌더에서 연결을 해 주어야 한다.


그림11. 액션 연결.

액션을 연결하고자 하는 텍스트 필드를 선택하고 'TextField Connections' 윈도우를 보이도록 한다. 텍스트 필드의 키보드에서 'return' 키를 누르면 액션이 반응하도록 할 것이기 때문에 'Did End On Exit' 액션을 이용하도록 한다. 'Did End On Exit' 의 오른쪽 부분의 원에 커서를 가져가면 십자가 모양으로 바뀌는 것을 볼 수 있다. 이것을 끌어다가 main 윈도우의 'File's Owner' 아이콘으로 가져가면 Xcode 에서 퍼스트리스폰더를 포기하는 액션이 정의된 메소드의 이름이 나타나는 것을 볼 수 있다. 이것을 선택하여 액션이 연결되도록 한다.


'return' 키가 없는 숫자패드 사라지게 하기.
일반적인 키보드에는 'return' 키가 포함되어 있어서 입력이 완료되었음을 알려줄 수 있다. 하지만, 숫자로만 이루어진 키패드에는 숫자와 삭제버튼만 있을 뿐이다. 이런 키보드를 사라지게 하기 위해서는 어떻게 해야 할까? 이것 역시 간단하다. 키보드가 아닌 다른 곳을 터치할때 키보드가 사라지게 만들면 된다. 키보드가 아닌 다른곳을 터치할때는 어떤 컨트롤러에 액션을 연결해 주어야 할는걸까? 답은 뷰 컨트롤러에 연결하면 된다. 하지만, 라이브러리를 아무리 찾아보아도 뷰 컨트롤러는 찾을 수가 없다. 하지만, 찾지 않아도 된다. 이미 뷰 컨트롤러는 UIview 안에 포함되어 있기 때문이다. 프로젝트를 생성하면 기본적으로 만들어지는 view 는 여러 뷰 라이브러리를 담아두는 컨테이너의 역할을 한다. 모든 라이브러리가 UIview 의 하위클래스라는 것이다. 또 UIcontrol 역시 UIview 의 하위클래스이기 때문에 view는 control 의 역할까지 가질 수 있는 것이다.


그림12. view 클래스 변경

main 윈도우에서 view 아이콘을 선택하고, 'Control Identity' 윈도우를 띄운다. 위의 그림과 같이 class identity 를 변결할 수 있는 메뉴가 나오는데 view 의 클래스를 UIcontrol 로 변경하도록 한다. 이제 '뷰' 에도 액션을 추가할 수 있게 되었다. 배경을 터치하여 키보드가 사라지는 액션을 추가하는 방법은 이전의 방법과 동일하다. 먼저 'keyBoardViewController.h' 파일에 액션을 선언하는 코드를 추가한다.

- (IBAction) textEndReturn: (id)sender;
- (IBAction) backgroundTap: (id)sender;
@end

그리 고 'keyBoardViewController.m' 파일에 '(IBAction)' 액션 메소드를 구현하는 코드를 추가한다.

- (IBAction) backgroundTap: (id)sender {
    [nameField resignFirstResponder];

    [AnumberField resignFirstResponder];
}

위의 액션이 실행되면 nameField 와 AnumerField 객체가 가지고 있는 퍼스트 리스폰더를 모두 포기하게 된다. 만약 위에 있는 '[nameField resignFirstResponder];' 를 주석처리 한다면 AnumberField 만 퍼스트 리스폰더를 포기하게 되므로, AnumberField 에서만 액션이 작용하는것과 같은 결과가 나타나게 된다.


숫자패드 사라지는 액션 연결하기.
모든 코딩을 마무리 하였다면, 인터페이스 빌더로 이동하여 액션들을 이어주는 작업을 하도록 한다.


그림13. UIcontrol 액션 연결하기.

main 윈도우에서 Control 아이콘을 선택하고 'Control Connections' 윈도우를 띄운다. 이 'Control' 아이콘은 화면의 가장 배경을 나타내는 View 와 같은 것이라고 할 수 있다. View는 화면 전 영역을 나타내기 때문에 버튼에서 사용했던 'Touch up Inside' 액션이 아닌 'Touch Down' 액션을 사용하도록 한다. 'Touch Down' 의 오른쪽에 있는 원으로 커서를 이동시켜 십자가 모양으로 변경되면 이것을 끌어다가 main 윈도우의 File's Owner 아이콘으로 가져다 놓는다. 팝업 메뉴로 나오는 액션 메소드중 배경을 클릭하여 키보드를 사라지게하는 메소드인 'backgroundTap' 메소드를 선택한다. 지금까지의 작업들을 저장하고 Xcode로 돌아가 빌드하고 실행해보도록 한다. 텍스트필드에 키보드를 통하여 입력이 가능하고, 'return' 버튼을 누르거나 배경을 클릭하면 키보드가 사라지는 것을 볼 수 있을 것이다. 좀더 자세한 상호작용이 가능해진 것이다!

Posted by seanhigher

댓글을 달아 주세요

최근에 달린 댓글

글 보관함