[iPhone SDK Development] chapter02-ViewControllers


개요

뷰 컨트롤러는 아이폰 개발에서 중심이 되는 부분이며, 모든 뷰 컨트롤러는 UIViewController 의 인스턴스이다.

 

컨트롤러는 일반적으로 MVC(Model-View-Controller) 패턴 중에서 중심 역할을 한다. BL(Business Logic)이 담겨있는 Model, 실제 인터페이스를 표현하는 뷰, 그리고 이런 뷰와 가장 밀접하게 관계된 곳이 Controller 다. 때문에 컨트롤러는 가장 자주 다루게 되는 부분이다.

1장의 예에서 처럼 뷰를 기술하는데 인터페이스 빌더를 통해서 nib 파일을 생성한 것이 전부이다. 간단한 애플리케이션에서는 모델이 존재하지 않을 수 있다. 하지만! 뷰 컨트롤러는 만들었다. 아이폰 애플리케이션이라면 적어도 뷰 컨트롤러 하나는 있어야 된다. 그만큼 뷰 컨트롤러가 가장 핵심이라는 말씀.

 

아이폰 애플리케이션에서도 컨트롤러는 유저가 UI에 반응하거나, 디바이스가 회전하는 등의 이벤트가 발생할 때 애플리케이션이 어떻게 반응해야 하는지를 다룬다.

 

뷰 컨트롤러에는 세가지 특수한 타입이 있다.

  • TableView
  • Navigation
  • TabController

 

2.1 첫번째 뷰컨트롤러 (first-iteration)

예제) 스크린을 건드리면 버튼이 상단 또는 하단으로 이동하는 애플리케이션

 

프로젝트생성

  1. xib 파일을 열어서 Interface Builder 실행 (뷰와 뷰컨트롤러 연결)

    1. 인터페이스 빌더한테 버튼이 클릭될 때 어떤 메소드가 수행되어야 하는지 버튼과 뷰컨트롤러를 연결시켜준다

      1. nib 도큐먼트 윈도우에서 File’s Owner 오브젝트의 Identity Inspector 를 불러온다.
      2. class actions 에 buttonClieked: 액션을 추가한다.  (ButtonViewController 가 buttonClicked: 라는 메소드를 갖는다는 의미)

      3. 즉, Controller 에 action 을 추가하고 UI 오브젝트가 이벤트 발생시 어떤 컨트롤러의 어떤 액션에 연결되는지 지정하는 것임.
  2. XCode 에서 컨트롤러 코드 생성

    1. header(.h) 에 declaration 추가
    2. 구현코드 작성 (.m)

2.2 멀티 뷰컨트롤러

2.3 아웃렛 생성과 연결

[개념/용어1] forward declaration”

@class 라는 directive(지시자) 를 가리키는 말인데, 헤더에서 또다른 헤더를 include 하는 것 대신 사용한다.

[개념/용어2]“outlets and actions”

보통 인터페이스 빌더에서 버튼같은 컨트롤이 활성화 되었을 때 응답하기 위한 오브젝트에 연결하기위한 용도로 사용한다.

컨트롤(source)을 드래깅 해서 오브젝트의 액션(destinnation)과 연결하게 된다.

2.4 뷰컨트롤러 생성

모달뷰를 다루는 뷰컨트롤러를 추가해보자.

[개념/용어3] “delegation”

다른 오브젝트에게 책임을 위임한다는 개념. 이 것은 위임 받은 오브젝트(second object)가 first object 와는 별도로 작성될 수 있다는 걸 의미한다. (? second object / first object)

[개념/용어4] “@properties” directive   

컴파일러에게 해당 인스턴스 변수에 대한 get/set 메소드를 구현하라는 선언임.

[개념/용어5] “@synthesize” directive    

헤더에 선언된 @properties 필드에 대해서 구현에서는 get/set 메소드를 생성하기 위해 @synthesize directive 를 사용한다 (?)

Configuring the Text Field

[개념/용어6] “first responder” object    

“first responder”가 된다 라는 표현을 쓴다. 특정 이벤트 타입을 얻어내는 최초의 인라인 오브젝트(function, code?), 모든 Cocoa Touch 의 텍스트 관련 컨트롤들은 first responder 되면 키보드가 나타난다.

 

TextField 등을 사용할 때 사용자가 어떻게 사용하길 바라는지 주의 깊게 고려해야한다. 두가지 설정 실험 “Capitalize”(correction 설정), “Return Key”(편집종료로 터치 하도록) 설정.

키보드를 나타나게 했을 경우 몇가지 고려해야할 사항

  • 텍스트에 일반적이지 않은 단어가 있으면 Correction을 Off 한다.
  • 텍스트가 이름과 같은 형식이면 각 단어를 Capitalize 한다.
  • 텍스트가 전화번호이거나 이메일주소 또는 URL 이라면 알맞은 키보드 타입을 사용한다.
  • 유저가 편집 종료시 어떻게하길 기대하는 가에 따라서 (특정 URL 로 이동, Google 에서 검색, 데이타를 저장 ) 알맞은 “Return” key 타이틀을 선택 한다.

 

“Text entry 가 얼마나 애플리케이션의 일부로서 적절하고 자연스럽게 느껴지느냐에 공을 들이면 들일수록 인기있는 애플리케이션이 될 것이다”

 

유저에게 단서가 되는 Placeholder text (입력 필드의 디폴트 안내문구 같은 것)를 적절하게 사용해야 한다. 이는 유저가 컨텍스트를 잃어버리지 않고 유지하는데 도움을 준다.

 

UITextFieldDelegate protocol 의 두가지 메소드

  • textFieldShouldReturn:    유저가 편집을 끝냈다는 것을 나타낼 때 text field 에 의해서 호출된다.

    • [YES|NO] YES => validation 을 원할 때, NO=> resign 으로부터 text field 를 first responder 상태로 유지하고 싶을 때.
  • textFieldDidEndEditing:   text field 가 편집이 끝날 때 마다 호출된다.  (ex. 셈플 예제에서 model view 를 animate out 시킬 적절한 포인트다)  

 

[개념/용어7] “resignFirstResponder”

text field 에 대한 first responder 상태를 resign

2.5 두번째 뷰컨트롤러

presentModalViewController:animated 메소드

   

셈플코드 제작 후기

  • Compile Error

    • StarterViewController.h 파일에서 아웃렛을 작성할 때 오타가 있었다.
        IBOutlet EditorViewController *EditorViewController;    // 이것 때문에 한참 삽질함.
  • 빌드가 제대로 된 이후에 시뮬레이터에서 애플리케이션이 실행이 안되고 계속 종료되는 문제 발생. (EXC_BAD_INSTRUCTION) 등등등의 에러 메시지…

    • 콘솔 로그를 살펴보니 EditorViewController 를 못찾았다. 위에서 오타난 상태로 IB 에서 연결시켰던 것이 문제였음.
    • 다시금 IB 에서 연결을 새로한 다음 -> 다시 클래스로 저장해주었더니 정상적으로 실행되었다.
    • IB 꼬졌다 ㅡㅡ;; 변경이 바로 반영 안되더라.

 

셈플코드첨부 : Button.zip , Starter.zip

실행후 Capitalize 등이 제대로 동작하는지 함 보자.

 

디버깅 삽질을 도와준 jenix, humbroll tanks.

 

이 글은 스프링노트에서 작성되었습니다.