보통 Table View의 Cell은 코드로 만드는 경우가 많습니다. 여기서는 인터페이스빌더에서 Table View Cell을 사용하는 간단한 샘플을 만들어 보겠습니다.





1. 프로젝트 생성과 AppDelegate 변경
Xcode를 실행하고 "New Project"를 클릭하여 "Window-based Application"을 선택하여 프로젝트를 생성합니다. 저는 그냥 IBCell이란 이름으로 프로젝트를 만들었습니다.

1) IBCellAppDelegate.h

@class TableViewController;


@interface IBCellAppDelegate : NSObject <UIApplicationDelegate> {


IBOutlet TableViewController *tableViewController;

    UIWindow *window;

}

2
인터페이스 빌더에서 연결을 위해 tableViewController의 아울렛 변수를 추가합니다.

2) IBCellAppDelegate.m

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

  

[window addSubview:[tableViewController view]];

    // Override point for customization after application launch

    [window makeKeyAndVisible];

}


메인 윈도우의 SubView로 tableViewController의 View를 추가합니다.

2. ViewController
1) 생성
UIViewController subclass로 TableViewController란 이름으로 클래스를 생성합니다. SDK 3 부터는 "With XIB for user interface"가 있어 선택할 경우 ViewController 오브젝트와 연결된 별도의 xib를 자동으로 생성하여 줍니다. 여기서는 편의를 위해 선택하지 않았습니다.
* 2009/06/26 추가
오늘 확인해 보니 Objective-C class 선택시에 하단에 Subclass of로 선택할 수 있는 클래스들이 나오네요. 버젼업되면서 왜 줄었나 했더니 여기로 들어 가 있었습니다. 위의 방법말고 아래에서 UITableViewController를 바로 선택하고 사용하시면 됩니다.
 

2) TableViewController.h

#import <UIKit/UIKit.h>



@interface TableViewController : UITableViewController {

IBOutlet UITableViewCell *myCell;

}


- (IBAction)goMyBlog:(id)sender;


@end


부모 클래스를 UIViewController에서 UITableViewController로 변경합니다. 그리고 인터페이스빌더에서 연결을 위해 myCell 아울렛 변수를 추가합니다. 그리고 버튼 클릭시 연결될 goMyBlog 액션 메소드를 선언합니다.

3) TableViewController.m

/* 버튼 클릭시 */

- (IBAction)goMyBlog:(id)sender {

NSURL *url = [NSURL URLWithString:@"http://www.cocoadev.co.kr/"];

[[UIApplication sharedApplication] openURL:url];

}


#pragma mark Table view methods


/* 색션 */

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

return 1;

}


/* 색션 타이틀 */

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

return @"소개";

}


/* */

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

return myCell;

}


/* 높이 */

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

return [myCell frame].size.height;

}


버튼 클릭시 실행될 메소드와 tableView의 delegate, datasource 메소드를 구현합니다.



3. 인터페이스 빌더

1) Table View Controller

인터페이스 빌더를 실행하고 라이브러리의 Controlls의 Table View Controller를 MainWindow.xib로 드래그해서 가지고 옵니다. Class를 TableViewController로 지정합니다.



좌측과 같이 Table View의 Style 속성을 Grouped로 지정합니다.



2) Table View Cell

라이브러리에서 Table View Cell을 MainWindow.xib로 드래그해서 가지고 옵니다.




아래와 같이 TableViewController의 myCell 아울렛에 가져온 Table View Cell을 연결합니다.


사용자 삽입 이미지
라이브러리 윈도우에서 Image View, Label, Rounded Rect Button, Text View를 드래그 해서 Table View Cell에 가져다 놓습니다.



Cell의 높이를 늘리고 각각의 컨트롤들을 아래와 같이 배치합니다. 적당한 이미지를 Xcode 좌측의 Groups & Files 아래의 Resources 그룹으로 드래그해서 프로젝트로 가져옵니다. Image View의 Image 속성에서 해당 이미지를 선택합니다. 입력이 되지 않도록 Text View의 Editable 속성의 체크를 해제합니다.
사용자 삽입 이미지

버튼 클릭시 사파리에서 해당 URL로 이동하기 위해 Text View Controller의 goMyBlog IBAction과 연결합니다.


4. 확인
Xcode에서 Build & Go를 클릭하면 시뮬레이터에서 아래와 같이 확인하실 수 있습니다.
SDK 3을 대충 보기만 하고 처음 사용해 보았는데 곳곳에 바뀐 부분이 눈에 뛰네요. SDK 3도 처음이고 오랫만에 포스팅이라 틀린 부분이 있는지도 모르겠습니다.

'iOS' 카테고리의 다른 글

아이폰 OS 4  (8) 2010.04.09
NSXMLParser로 RSS 읽어오기  (21) 2009.08.05
cocos2d 개발환경 설정  (24) 2009.04.13
iPhone SDK 3.0 beta 2  (4) 2009.04.05
UITableView의 메모리 누수 현상  (4) 2009.02.05
AND

앱스토어에서 링크를 위해 어플 소개 블로그를 성의 없이 하나 만들어 놓고 방치해 놓고 있었습니다. 무심결에 들어 가 보았다가 처음으로 달린 댓글을 보게되었습니다. 버려둔 블로그에서 버려둔 액션 카운터란 어플에 대한 피드백을 뒤늦게 확인했습니다. 개인적으로 너무 안일했다는 생각도 들었지만 첫 리플이라 반가웠습니다.

분명 악플일거라 짐작하고 클릭해보니 본인이 찾던 어플이였다는 말과 함께 역시나 저도 항상 찔리고 있었던 경악스러운 돼지 효과음에 대한 개선을 요구하는 내용이었습니다. 찾아 보니 요번달에 딱 한명이 구매를 했는데 그분이 와서 써주신 것 같습니다. 혹시나 하고 아이튠즈로도 들어 가보니 좋은 평과 함께 여러가지 조언을 해주었습니다.

주위분들에게 간혹 조언을 얻기위해 보여주기도 하지만 대부분의 의견은 '귀엽네', '괜찮네' 정도의 평입니다. 앞에서 나쁜 평은 할 수 없겠고 잠깐 본 느낌을 이야기하는 것 같습니다. 이에 반해 실제 사용자들의 저런 관심과 피드백은 정말로 소중한 정보가 됩니다. 스모킹 카운터도 클라리온님의 리뷰와 방명록의 글들로 업그레이드의 방향과 오류수정에 많은 도움을 받았고, 무엇 보다도 업그레이드를 해야 되겠다는 강한 동기 부여를 해준다는 점이 가장 좋은 것 같습니다.


어제 아무 생각없이 이분이 말씀해준 내용 그대로 업그레이드를 했습니다. 듣기 무난한 효과음으로 교체하고, 강아지가 더 좋을 것 같다고 해서 캐릭터를 강아지와 토끼를 추가하고 선택할 수 있도록 하고, 히스토리 목록이 좀 크게 나오고 스크롤되면 좋겠다고 해서 그렇게 바꿨습니다. 그리고 스모킹 카운터의 UI를 복사해 왔습니다. 시키는대로 해서 올렸는데 이 양반 마음에 들지는 잘 모르겠습니다.

작년에 "소프트웨어, 누가 이렇게 개떡같이 만든거야"라는 다소 자극적인 제목의 책을 읽은 적이 있습니다. 제목과 같이 통렬한 비판이나 진실을 기대해지만 개발자들과 IT 업계에 종사하는 사람들이 보기에는 너무나 평범하고 밍밍한 이야기들이었습니다.

소프트웨어 누가 이렇게 개떡같이 만든 거야
카테고리 컴퓨터/IT
지은이 데이비드 S. 플랫 (인사이트, 2008년)
상세보기

이책의 주제가 대충 "사용자를 이해 못하는 개발자의 무지로 인해 소프트웨어는 개떡이 되었고 사용자들은 개발자들에 피드백을 보내 좋게 만들어야 한다" 였습니다. 요즘 실제 사용자들로 부터 직접 체험을 하고보니 이 책에서 수없이 강조하던 이 평범한 이야기에 새삼 많은 공감을 하게 됩니다.

AND

발표전에 한국출시가 거의 확실시되던 분위기가 있어 이번에는 많은 기대를 가졌습니다. 하지만 아쉽게도 한국에서 출시한다는 소식은 없었습니다. 2년반정도를 기다리고 있는데 도대체 얼마를 더 기다려야 정말로 나오는 건지 답답합니다.

터치가 있지만 아이폰을 간절히 바라는 이유는 카메라로 찍어서 바로 블로그나 다른 서비스들에 글과 사진을 바로 올릴 수 있고, 터치와 함께 늘 핸드폰도 같이 챙겨야 하는 불편함도 없앨수 있기 때문입니다. 제 맘대로 되는 것이 아니니 그냥 신경을 끊고 또 기다려 봐야죠.

어제 애플 사이트에서 WWDC 키노트가 공개되어 보았습니다. 이미 관련된 내용들을 보았고 개발자 사이트에선 대부분 공개된 내용이지만, 스노우 레오퍼드와 아이폰 OS 3.0 소개하는 부분이 재미있었습니다.  스노우 레오퍼드는 64bit 지원, GCD, OPenCL 기술을 강조하더군요. 그외에 새로운 퀵타임 X와 MS의 익스체인지 서버 지원등의 내용이 있었습니다.

(이미지 출처: 애플 키노트)

사용자 입장에서 스노우 레오퍼드의 업그레이드 주내용이 성능향상에 있다는 것이 매우 반가운 소식입니다. 게다사 설치용량은  오히려 줄었다고 하더군요. 집에 오래된 초기 인텔 맥미니가 하나 있는데 설치가 가능할 것 같다는 생각이 듭니다.

아이폰 OS 3.0의 업글레이드 부분도 이미 개발자 사이트에선 공개된 내용이지만 이를 활용한 몇가지 실제 적용된 어플들을 볼 수 있어 좋았습니다. 3.0의 새로운 기능들로 인해 본격적으로 아이폰의 진수를 보여주는 어플들이 많이 나올 것 같다는 생각이 들었습니다.

스노우 레오퍼드도 그렇고 아이폰 OS 3.0도 그렇고 애플의 업그레이들은 처음부터 모든 것이 다 계획되어 있던 것이 아닌가 하는 착각이 들정도로 업그레이드 전략이 예술인 것 같습니다. 실제 다 계획되어 있는 것인지도 모르겠습니다.

(이미지 출처: 애플 키노트)

마지막으로 이전 아이폰보다 2배 빨라지고 300만 화소의 카메라, 동영상 촬영, 음성명령이 가능한 아이폰 3Gs에 대한 소개가 있었는데 그야말로 그림의 떡이었습니다. 잊고 지내다 보면 언젠가는 나오겠죠. 휴~

AND