본문 바로가기

개발/App Developer

UITableView - 델리게이트 구현이론(1)


* 어플 개발에서 게임이 아닌 이상 테이블 뷰를 제일 많이 사용한다.

 

  * 이는 '맥부기카페 :http://cafe.naver.com/mcbugi.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=6694 '에서 발췌한 내용으로

     IB없이 UITableViewController로 테이블 뷰를 구현하는 것이 아닌 UIViewController를 만들어 그 안에 구현하는 식을 설명한다

 

  * UITableView의 중요성을 인지하고 개념정리를 할려던 중 개념 정리에 좋은 컨텐츠인 것 같아 저장을 하여본다.

 

 

 

1. 새 프로젝트에서 Window Based Application 으로 프로젝트를 만든다.

 

 

2. 밑에 사진이 인터페이스 빌더 없이 만들어진 순수 코드이다.

    모든 어플은 처음에 '프로젝트명AppDelegate'로 만들어져 시작한다. (그전에 main 함수를 포함한다.)

 

 

 - 앱델리게이트만 있는 상태에서 화면에 뜰 뷰는 window라는 변수(UIWindow)로 지정되어 있다.

    그래서 window가 가장 최상위 뷰라 생각하면 된다. 나중에 뜰 뷰들은 전부 window 하위 뷰로 들어간고 생각하자.

 

3. 뷰 컨트롤러를 하나 만든다.

 

 

  - iPhoneOS > Cocoa Touch Classes > UIViewController subclass 선택

 

 

  - 내비게이션 컨트롤러와 이 컨트롤러가 시작 시에 보여줄 루트 뷰 컨트롤러를 생성한다.

     꼭 테이블 뷰를 루트 뷰로 만들 이유는 없지만 드릴다운(drill down)에 가장 적합한 구조이며

     커스터마이즈 하기 쉽기에 루트 뷰를 사용한다.(클래스명은 상관없음)

     * 이는 루트 뷰에 대한 설명이며 위의 class명은 보기 쉽기 위해 작성한 것이다.

 

 

 - RootViewController가 생성되었다. 이 객체를 사용하기 위해 앱 델리게이트를 연결해 보자.

 

4. 기본 제공되는 Delegate의 헤더 파일에 아래와 같이 선언해 주자.

 

 

  - 일단 RootViewController를 참조하기 위해 임포트를 시켜준다.

        #import "RootViewController.h"

  

   @interface testAppDelegate : NSObject <UIApplicationDelegate> {

RootViewController *RVC;  // 추가할 부분
UIWindow *window;

// 이 안에 testAppDelegate객체 안에서 사용될 클래스 변수를 적는곳입니다. 

      }

 

      이미 기본적으로 window 변수가 이미 정의되어 있다.

      이 곳에  RootViewController *RVC; 를 사용할 객체로 지정할 변수를 정의해 준다.

 

 

5. 구현 파일(.m 파일 여기서는 testAppDelegate.m)에서 아래 코드를 추가합니다.

 

 


- (void)applicationDidFinishLaunching:(UIApplication *)application {    

RVC = [[RootViewController alloc] init]; // < 추가

[window addSubview:RVC.view];            // < 추가

    // Override point for customization after application launch

    [window makeKeyAndVisible];

}

 
applicationDidFinishLaunching 함수는 어플이 실행되었을때 호출되는 함수입니다

RVC = [[RootViewController allocinit]; // 처음 사용될 RootViewController를 만든후 초기화 합니다.

[window addSubview:RVC.view];    // RootViewController에 달린 뷰를 window에 추가합니다

    
그리고 alloc하여 retain 된 메모리를 해제하기 위해
- (void)dealloc에서 [RVC release];  를 추가합니다.
이 함수는 해당 객체의 레퍼런팅 카운팅을 -1 해줍니다. 레퍼런스 카운트가 0이 되면 객체의 dealloc 메소드가 호출되고
메모리에서 제거됩니다.
앱 델리케이트의 경우 어플이 종료 될 때 호출되기 때문에 큰 차이는 없지만, 확식히 결자해지의 원칙으로 적어두는 것이 좋습니다.
 
여기까지하면 앱 델리게이트에서의 준비는 마무리 됐습니다.
 
이제 본격적으로 RootViewController에 대해 다뤄보겠습니다.
 
  * 코딩 시작전 이론 설명
 
     루트뷰컨트롤러 객체에서 테이블 뷰 객체를 만들 것입니다.
     이 경우 테이블 뷰 객체는 루트뷰컨트롤러의 하위로 포함되겠지만,
     그렇다고 테이블 뷰 객체의 데이터에 맘대로 접근 할 수 있는 것은 아닙니다.
     테이블 뷰 객체에서 허가된 속성이나 명령어에만 접근 할 수 있습니다.
 
      API에 대략 접근 가능한 속성을 볼 수 있습니다. (<-- 개인적으로 해석...)
      다만 기본적인 것들인 리스트나 그룹, 셀이 선택되었을 때
      이런 것들은 프로토콜 설정을 통해 접근하게 됩니다.
 
      만약 한 객체의 클래스를 자작해서 다루는 거라면 일방적으로 데이터를 뽑아오거나 호출이 가능합니다만,
      API의 경우 테이블 뷰의 소스코드까지 접근이 가능한 것은 아닙니다.
 
      맨 처음 해야 할 일은 헤더에서 프로토콜 설정을 해줍니다. (이건 테이블 뷰와 약속을 하는 겁니다.)
 
      테이블 뷰의 속성을 보시면 delegate와 datasource가 있습니다.
      나중에 코딩 작업에서 보시면 아시겠지만,
 
      delegate = self;
      datasource = self;
      로 설정합니다.
      이건 데이터나 테이블이 어떤 이벤트를 호출할 때 자기 객체 즉 루트뷰컨트롤러에 있는 함수를 호출하라는 뜻입니다.
 
      위 설정을 마친 후 뷰가 로드되게 되면 테이블 뷰는 이 루트뷰컨트롤러에 메세지를 보냅니다.
      그리고 대화 하는 식으로 데이터 설정이 일어납니다.
 
   ex)
      테이블 뷰 : 그룹이 몇개냐?
      루트뷰컨트롤러 : 1개다!
 
      테이블 뷰 : 0번 그룹의 셀 갯수가 몇개냐?
      루트뷰컨트롤러 : 5개다.
        * 테이블은 셀의 집합입니다.
 
      테이블 뷰 : 0번 그룹의 0번 셀의 데이터를 달라?
      루트뷰컨트롤러 : 이거다 (return cell)
 
      이런 식으로 대화(메세지)가 오가며 테이블 뷰에 데이터가 구현됩니다.
 
   기본 개념은 이정도로 해두시고 지금부터 코딩에 들어갑니다.
 
1. 처음 만들어진 뷰 컨트롤러(RootViewcontroller) 안에는 아무것도 없습니다. (기본 선언은 있음..)
 
 
- RootViewController.h 헤더 파일
 
 
- RootViewController.m 구현파일
 
2. 우선 myTable 변수를 클래스 변수로 정의 합니다.
 
 
3. 그리고 UIViewController와 '{' 사이에 ' <UITableViewDelegate, UITableViewDataSource> ' 를 넣습니다.
    이것은 앞서 설명한 테이블 뷰와의 약속으로 이 클래스가 UITableViewDelegate, UITableViewDataSource의 프로토콜에
    따른다는 선언입니다. 통신 프로토콜을 맞춘다고 생각하면 됩니다.
 
 
4. 그리고 RootViewController.m에서 init 함수를 생성해 줍니다.
 
 
이어서 할 것
참고 사이트 :
 
 
 
 
   
 

'개발 > App Developer' 카테고리의 다른 글

UI 의 작동  (0) 2010.09.06
아이패드 사용기  (0) 2010.09.06
UITableView - 델리게이트 구현이론(1)  (0) 2010.09.06
IB 없이 하기, UIButton  (0) 2010.09.06
IB 없이 하기, UITableView끝장보기 (2) 그룹과 셀  (0) 2010.09.06