최초 작성일 : 2013/03/28 08:42 


한동안 Copy & Paste에 길들여져 있었더니 간혹 별 것 아닌 부분에서 헤매게 된다.


새로 개발하는 앱의 설정 화면을 테이블 뷰로 하고
스타일을 UITableViewStyleGrouped로 주었다.

그런데 이 것이 배경색이 딱 세로 스프라이트로 고정되어서
tableview.backgroundColor로 설정을 해도 변경이 되지 않는 것이다.

stack overflow에서 확인한 결과 다음과 같이 처리하니 해결이 되었다.

UIView* bview = [[UIView allocinit];

bview.backgroundColor = [UIColor clearColor];

[tableview setBackgroundView:bview];


다른 방법으로는 다음과 같은 방법이 있는데 iOS 5.x에서 문제가 발생한다고 한다.


[tableView setBackgroundView: nil];


블로그 이미지

마즈다

이제 반백이 되었지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

댓글을 달아 주세요

최초 작성일 : 2010/04/17 04:21



RootViewController.h


@interface RootViewController : UITableViewController {

NSArray *regions;

}

//지역 객체를 담을 배열 선언

@property (nonatomicretain) NSArray *regions;


@end



RootViewController.m


#import "RootViewController.h"

#import "SimpleSectionedTableViewAppDelegate.h"

#import "Region.h"

#import "TimeZoneWrapper.h"


//어떤 경우에 사용되는지  모르겠음…???

NSString *localeNameForTimeZoneNameComponents(NSArray *nameComponents);

NSMutableDictionary *regionDictionaryWithNameInArray(NSString *name, NSArray *array);

@implementation RootViewController


@synthesize regions;


#pragma mark -

#pragma mark View lifecycle

- (void)viewDidLoad {

//Foundation Framework 있는 함수로 NSBundle.h 선언되어있음. Localizable.string 있는 파일에서

//key "Time Zones" 되어있는 값을 가져옴 

self.title = NSLocalizedString(@"Time Zones"@"Time Zones title");

}


#pragma mark -

#pragma mark Table view data source methods

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

// Number of sections is the number of regions.

//섹션의 수는 regions 배열의 크기를 돌려줌

return [regions count];

}


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

// Number of rows is the number of time zones in the region for the specified section.

// 섹션에 있는 행의 수는 regions 배열에 들어있는 각각의 region 인스턴스로부터

//TimeZoneWrapper 클래스의 배열인 timeZoneWrappers 크기를 돌려줌

Region *region = [regions objectAtIndex:section];

return [region.timeZoneWrappers count];

}


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

// The header for the section is the region name -- get this from the region

//at the section index.

// 섹션의 제목은 regions 배열의 section 위치에 있는 region 인스턴스로부터 name 속성을 사용함

Region *region = [regions objectAtIndex:section];

return [region name];

}


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

//cell 재활용을 위해 아이디를 부여

static NSString *MyIdentifier = @"MyIdentifier";


//재활용할 cell 없으면 새로 생성

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];

if (cell == nil) {

cell = [[[UITableViewCell allocinitWithStyle:UITableViewCellStyleDefault 

 reuseIdentifier:MyIdentifier] autorelease];

}

// Get the section index, and so the region for that section.

//NSIndexPath 일련의 배열들의 트리 구조를 표현 하는 것으로 부여되는 값들은 

//각각 다음 단계 배열의 인덱스를 의미한다여기서는 index path section - row 이어지면

//각각 지역 정보를 가지고 있는 regions 배열의 인덱스와 time zone 정보를 가지고 있는

//timeZoneWrappers 배열의 인덱스를 의미한다.

//index path에서 regions 인덱스를 가져와 해당 인덱스의 region 인스턴스를 가져온다.

Region *region = [regions objectAtIndex:indexPath.section];

//regions로부터 가져온 region 인스턴스의 timeZoneWrappers 배열에서 index path

//있는 timeZoneWrappers 인덱스를 가져와 해당 위치의 timeZoneWrapper 인스턴스를 가져온다.

TimeZoneWrapper *timeZoneWrapper = [region.timeZoneWrappers objectAtIndex:indexPath.row];


// Set the cell's text to the name of the time zone at the row

//가져온 timeZoneWrapper 선언된 localeName 속성을  셀의 제목으로 설정한다.

cell.textLabel.text = timeZoneWrapper.localeName;

return cell;

}


#pragma mark -

#pragma mark Table view delegate method

/*

 To conform to Human Interface Guildelines, since selecting a row would have no effect (such as navigation), make sure that rows cannot be selected.

 */

//특정 위치의 셀이 선택되었을   처리 내용이 들어갈 메서드

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {

return nil;

}


#pragma mark -

#pragma mark Memory management

//메모리 해제

- (void)dealloc {

[regions release];

     [super dealloc];

}


@end


블로그 이미지

마즈다

이제 반백이 되었지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

댓글을 달아 주세요

최초 작성일 : 2010/04/11 10:40



SimpleSectionedTableViewAppDelegate.h

@interface SimpleSectionedTableViewAppDelegate : NSObject <UIApplicationDelegate> {

UIWindow *window;

UINavigationController *navigationController;

NSArray *list;

}


//retain방식으로 객체의 참조를 얻어옴. 자동으로 getter/setter 선언

@property (nonatomicretainIBOutlet UIWindow *window;

@property (nonatomicretain) UINavigationController *navigationController;

//copy방식으로 객체의 참조를 얻어옴. 자동으로 getter/setter 선언

@property (nonatomiccopy) NSArray *list;


@end



SimpleSectionedTableViewAppDelegate.m


#import "SimpleSectionedTableViewAppDelegate.h"

#import "RootViewController.h"

#import "Region.h"



@implementation SimpleSectionedTableViewAppDelegate

//인스턴스 변수들에 대한 getter/setter 구현 자동 생성

@synthesize window;

@synthesize navigationController;

@synthesize list;


//애플리케이션이 구동 완료된 후의 초기화 작업 진행

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

// Create the navigation and view controllers

//뷰 컨트롤러를 생성하고 생성된 뷰 컨트롤러를 스택의 가장 아래에 놓는 네비게이션 컨트롤러를 생성

RootViewController *rootViewController =

[[RootViewController allocinitWithStyle:UITableViewStylePlain];

UINavigationController *aNavigationController =

[[UINavigationController alloc]initWithRootViewController:rootViewController];

self.navigationController = aNavigationController;


//메모리 해제

[aNavigationController release];

[rootViewController release];

//rootViewController에 지역 정보 설정 (section 설정)

[rootViewController setRegions:[Region knownRegions]];

// Configure and display the window

//윈도우에 네비게이션 컨트롤러 뷰를 추가함

[window addSubview:[navigationController view]];

[window makeKeyAndVisible];

}


//메모리 해제

- (void)dealloc {

[navigationController release];

    [window release];

[list release];

    [super dealloc];

}



@end


블로그 이미지

마즈다

이제 반백이 되었지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

댓글을 달아 주세요

최초 작성일 : 2010/04/10 16:06 



SimpleSectionedTableView 추가된 내용  하나는 Model 클래스가 추가되었다는점이다.

Model Object 데이터를 캡슐화 하는 핵심적인 역할을 하고 있으며  데이터 접근할 있는

접근자를 제공한다모델 클래스들은 전통적인 행동 방식(getter 이용하는 ?) 내에서 값을 추가할  있다.

Region 클래스는 시스템으로부터 시스템이 알고있는 TimeZone 정보를 가져와
지역 이름을 추출하여 Region 인스턴스들이 담긴 regions 배열을 만들고
regions 배열에 담긴 각각의 Region 인스턴스에 있는 TimeZoneWrappers라는 
인스턴스 배열 변수에 TimeZoneWrapper 클래스의 인스턴스를 설정하여
넣는다.

전체적인 구조는 Region 클래스는 지역 이름을 담당하여 지역 이름의 배열을 만들고
TimeZoneWrapper 클래스는 Time Zone 관련 데이터를 담당하여 각각의
Region 클래스의 인스턴스 안에 역시 배열로 들어간다.

regions[0]
timeZoneWrappers[0]
timeZoneWrappers[1]
timeZoneWrappers[2]
...
regions[1]
timeZoneWrappers[0]
timeZoneWrappers[1]
...
regions[2]
timeZoneWrappers[0]
timeZoneWrappers[1]
...
...

regions[0], regions[1], regions[2]는 각각 Region 클래스의 인스턴스이고
timeZoneWrappers[i]는 각각 TimeZoneWrapper 클래스의 인스턴스들이다.


Region.h


@interface Region : NSObject {

NSString *name;

NSMutableArray *timeZoneWrappers;

}

//@property 이용하여 getter setter 선언 자동화

//@property 속성으로 copy 지정된 경우얕은 복사가 일어난다.

//얕은 복사는 원본 데이터가 담겨있는 메모리의 주소만을 복사하여  변수에

//넘기고 원본의 주소는 release 되는 형태로 복사가 이루어진다고 하여 실제로

//데이터가 2개가 되는 것은 아니다.

@property (nonatomiccopy) NSString *name;

@property (nonatomicretain) NSMutableArray *timeZoneWrappers;

//클래스 메서드의 선언앞에 + 기호로 시작하는 메서드는 클래스 메서드로

//주로 클래스의 인스턴스를 생성하거나 글로벌 클래스 데이터에 접근하는 역할을 하며

//java static 선언과 유사하다고 생각하면 된다.

//반대로 -기호로 시작하는 메서드는 인스턴스 메서드이며 인스턴스 메서드는 클래스의

//인스턴스와  생명 주기를 함께 한다.

+ (NSArray *)knownRegions;

@end




Region.m

지역과 지역별 Time Zone 데이터를 설정하고 정렬하는 Model 클래스


//헤더파일 임포트

#import "Region.h"

#import "TimeZoneWrapper.h"

//카테고리 선언 : Private라는 이름으로 Region 클래스에 카테고리를 선언함

@interface Region (Private)

- (id)initWithName:(NSString *)regionName;

//setUpKnownRegions 메서드는 클래스 메서드로 선언도어 있으므로 인스턴스 생성 없이

//클래스로부터 바로 호출할  있다.

+ (void)setUpKnownRegions;

- (void)addTimeZoneWrapper:(TimeZoneWrapper *)timeZoneWrapper;

- (void)sortTimeZones;

@end


@implementation Region

//@property 키워드와 함께 name, timeZoneWrapper 대한 getter setter 자동으로 구현한다.

@synthesize name, timeZoneWrappers;

//클래스 메서드인 setUpKnownRegions 통해 값을 설정할  있도록 static으로 선언된 변수

static NSMutableArray *knownRegions = nil;

//클래스 메서드인 knownRegions 내부에서 카테고리를 통해 선언된 클래스 메서드인

//setUpKnownRegions 메서드를 호출한다  사용된 self Region 클래스를 의미한다.

+ (NSArray *)knownRegions {

if (knownRegions == nil) {

[self setUpKnownRegions];

}

return knownRegions;

}

#pragma mark -

#pragma mark Memory management.

//메모리 해제...

- (void)dealloc {

//copy 생성된 것에 대한 메모리 해제

[name release];

[timeZoneWrappers release];

[super dealloc];

}

#pragma mark -

#pragma mark Private methods for setting up the regions.

//카테고리를 통해 선언된 메서드의 구현인자로 받은 regionName 통해 호출되는 copy

//NSObject 구현되어있으며  copy 메서드는 NSCopying 적용된 subclass에서

//copyWithZone 함수를 호출하는 방식으로 동작한다. NSCopying 프로토콜은 NSString

//적용 되어 있다.

//copy 새로운 인스턴스 변수에 원본의 주소값을 복사한  retain count 1 증가 시키므로

//release 통해 메모리 해제를 해주어야 한다.  

- (id)initWithName:(NSString *)regionName {

if (self = [super init]) {

name = [regionName copy];

timeZoneWrappers = [[NSMutableArray allocinit];

}

return self;

}

//클래스 메서드인 setUpKnownRegions 구현

+ (void)setUpKnownRegions {

//시스템으로부터 확인된 TimeZone 이름 배열을 가져오고  배열의 크기와 동일하게

//변경 가능한 배열인 regions 만든다.

NSArray *knownTimeZoneNames = [NSTimeZone knownTimeZoneNames];

NSMutableArray *regions = [[NSMutableArray allocinitWithCapacity:[knownTimeZoneNames count]];

//knownTimeZoneNames 크기만큼 루프를 돌면서 배열  하나 하나를 timeZoneName 넣는다.

for (NSString *timeZoneName in knownTimeZoneNames) {

//knownTimeZoneNames로부터 받은 문자열을 "/" 구분자로 나누어

//배열 nameComponents 담는다.

NSArray *nameComponents = [timeZoneName componentsSeparatedByString:@"/"];

//배열 nameComponents 0번째 값을 가져와 regionName 할당한다.

NSString *regionName = [nameComponents objectAtIndex:0];

// Get the region  with the region name, or create it if it doesn't exist.

Region *region = nil;

//for문을 통해 regions 배열의  하나 하나를 Region 인스턴스인 aRegion 할당한다.

for (Region *aRegion in regions) {

//regions로부터 받아온 값의 name 속성이 regionName 같다면

//region aRegion 할당하고 루프를 빠져나옴

if ([aRegion.name isEqualToString:regionName]) {

region = aRegion;

break;

}

}

//만일 name 일치하는 경우가 없다면 regionName 사용하여 새로운 region 만들어

//regions 추가한다.

if (region == nil) {

region = [[Region allocinitWithName:regionName];

[regions addObject:region];

[region release];

}

//timeZoneName 사용하여 NSTimeZone 인스턴스인 timeZone 생성하고

NSTimeZone *timeZone = [NSTimeZone timeZoneWithName:timeZoneName];

//생성된 timeZone timeZoneName 배열로 만든 nameComponents 인자로

//TimeZoneWrapper 인스턴스를 생성한다.

TimeZoneWrapper *timeZoneWrapper = [[TimeZoneWrapper allocinitWithTimeZone:timeZonenameComponents:nameComponents];

//생성된 timeZoneWrapper NSMutableArray timeZoneWrappers 넣는다.

[region addTimeZoneWrapper:timeZoneWrapper];

//alloc으로 생성했으므로 메모리 해제

[timeZoneWrapper release];

}

// Now sort the time zones by name

//카테고리를 통해 추가된 함수를 호출하여 이름순으로 정렬

for (Region *aRegion in regions) {

[aRegion sortTimeZones];

}

// Sort the regions

//지역(region) 정렬

//"name" 속성을 기준으로 오름차순 정렬을  것임을 NSSortDescriptor클래스의 인스턴스를 통해 설정

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor allocinitWithKey:@"name" ascending:YES];

//initWithObjects 인자로 넘겨받은 C 배열로부터 count 인자로 넘겨받은 수만큼의(여기서는 1객체를

//가져와 새롭게 배열로 할당한다.

NSArray *sortDescriptors = [[NSArray allocinitWithObjects:&sortDescriptor count:1];

//sortDescriptors 이용해 실제로 배열을 정렬한다.

[regions sortUsingDescriptors:sortDescriptors];

[sortDescriptor release];

[sortDescriptors release];

knownRegions = regions;

}

//인자로 받은 timeZoneWrapper NSMutableArray timeZoneWrappers 넣는다.

- (void)addTimeZoneWrapper:(TimeZoneWrapper *)timeZoneWrapper {

[timeZoneWrappers addObject:timeZoneWrapper];

}

- (void)sortTimeZones {

// Sort the time zones by name

//time zones 정렬 - 상세 과정은 위의 지역 정렬 참조

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor allocinitWithKey:@"localeName"ascending:YES];

NSArray *sortDescriptors = [[NSArray allocinitWithObjects:&sortDescriptor count:1];

[timeZoneWrappers sortUsingDescriptors:sortDescriptors];

[sortDescriptor release];

[sortDescriptors release];

}

@end




TimeZoneWrapper.h


//TimeZoneWrapper 인터페이스

@interface TimeZoneWrapper : NSObject {

NSString *localeName;

NSTimeZone *timeZone;

}

//지역 이름과 time zone 설정을 위한 인스턴스 변수 선언  getter/setter 선언

@property (nonatomiccopy) NSString *localeName;

@property (nonatomicretain) NSTimeZone *timeZone;

//초기화를 위한 인스턴스 메서드 선언

- (id)initWithTimeZone:(NSTimeZone *)aTimeZone nameComponents:(NSArray *)nameComponents;

@end



TimeZoneWrapper.m


#import "TimeZoneWrapper.h"



@implementation TimeZoneWrapper

//인스턴스 변수들에 대한 getter/setter 구현

@synthesize localeName, timeZone;


- (id)initWithTimeZone:(NSTimeZone *)aTimeZone nameComponents:(NSArray*)nameComponents {

if (self = [super init]) {

//retain 통해 인스턴스 할당. retain 인스턴스 자신을 반환하며 참조 카운트를 1 증가 시킨다.

//인스턴스의 사용이 종료되기 전까지 메모리에서 해제하는 것을 막는다따라서 사용 후에 반드시

//적절한 시점에서 release 해주어야 한다.

timeZone = [aTimeZone retain];

NSString *name = nil;

//인자로 넘어온 nameComponents 배열의 크기가 2인경우 nameComponents 

//인덱스 1 있는 값을 retain 통해 name으로 할당한다.

if ([nameComponents count] == 2) {

name = [[nameComponents objectAtIndex:1retain];

}

else {

//그렇지 않은 경우 인덱스 2 값과 인덱스 1 값을 조합하여 name 할당한다.

name = [[NSString allocinitWithFormat:@"%@ (%@)", [nameComponentsobjectAtIndex:2], [nameComponents objectAtIndex:1]];

}

//name 문자열에서 "_" 모두 " " 바꾸어 localeName 할당한다.

localeName = [[name stringByReplacingOccurrencesOfString:@"_"withString:@" "retain];

[name release];

}

return self;

}


//메모리 해제

- (void)dealloc {

[localeName release];

[timeZone release];

[super dealloc];

}



@end


블로그 이미지

마즈다

이제 반백이 되었지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

댓글을 달아 주세요

최초 작성일 : 2010/04/10 06:47 


TableViewSuite 샘플의 두 번 째 예제인 SimpleSectionedTableView의 스크린 샷.

Section으로 나누어진 테이블 뷰를 구현한 예제이다.

섹션은 회색 타이틀 바로 구분된다.



블로그 이미지

마즈다

이제 반백이 되었지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

댓글을 달아 주세요

최초 작성일 : 2010/03/28 09:54 


UITableView는 2개의 protocol을 구현하고 있는데

UITableViewDelegate는 테이블 뷰의 설정을 처리하고,
UITableViewDataSource는 테이블 뷰의 각 행의 데이터를 처리한다.

'Development > Tips' 카테고리의 다른 글

[옛 글] [linux] watch 명령어  (0) 2013.07.16
[옛 글] [Tip] enum 선언  (0) 2013.07.15
[옛 글] [Tip] alloc(new), copy, retain  (0) 2013.07.15
[옛 글] [Tip] UITableView  (0) 2013.07.08
[옛 글] [DBMS]repository create error 처리  (0) 2013.07.05
[옛 글] [SQL] Merge문 예제  (0) 2013.07.05
블로그 이미지

마즈다

이제 반백이 되었지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

댓글을 달아 주세요

최초 작성일 : 2010/03/28 08:38



RootViewController.h


//UITableViewController를 상속받은 RootViewController 선언

@interface RootViewController : UITableViewController {

//클래스 변수로 NSArray 타입의 timeZoneNames선언

NSArray *timeZoneNames;

}


//접근자와 변경자 자동 선언 키워드

@property (nonatomicretain) NSArray *timeZoneNames;


@end




RootViewController.m

//선언부 import

#import "RootViewController.h"

#import "SimpleTableViewAppDelegate.h"



@implementation RootViewController

//접근자와 변경자 자동 구현 키워드

@synthesize timeZoneNames;


//UIViewController에 있는 함수. 메모리에 컨트롤러의 뷰가 로드된 후 호출됨

- (void)viewDidLoad {

     //title은 UIViewController에 있는 속성

   //NSLocalizedString : Foundation Function. NSBundle에 있는

     //localizedStringForKey:value:table: 함수를 실행시켜

  //지역화된 문자열을 반환Time Zones라는 테이블로부터

     //Time Zones title이라는 값을 가져온다.

self.title = NSLocalizedString(@"Time Zones"@"Time Zones title");

}


//UITableView에 구현된 UITableViewDataSource protocol에 있는 함수. 

//테이블 뷰에 섹션이 몇개 있는지 갯수를 반환

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

// There is only one section.

return 1;

}



//UITableView에 구현된 UITableViewDataSource protocol에 있는 함수. 

//인자로 넘어간 테이블 뷰 내의 섹션에 몇개의 row가 있는지를 반환

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

// Return the number of time zone names.

//timeZoneNames배열의 내용이 그대로 테이블 뷰를 구성하므로 그 크기를 반환함

return [timeZoneNames count];

}


//UITableView에 구현된 UITableViewDataSource protocol에 있는 함수. 

//인자로 넘어간 테이블 뷰의 특정 위치(인자로 넘어간 indexPath)에 cell을 삽입하는 함수.

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

static NSString *MyIdentifier = @"MyIdentifier";

// Try to retrieve from the table view a now-unused cell with the given identifier.

//인자로 넘어간 문자열을 이름으로 갖는 재사용 가능한 테이블 뷰 셀을 반환.

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];

// If no cell is available, create a new one using the given identifier.

//만일 재사용 가능한 셀이 없으면 새로운 셀을 생성

if (cell == nil) {

// Use the default cell style.

//alloc으로 생성하였으므로 반드시 release해주어야 함. 그러나 cell은 다른 위치에서 참조되고 사용되므로

//autorelease를 설정하여 처리함

//UITableViewCellStyleDefault라는 셀 스타일과 MyIdentifier라는 식별자로 셀을 초기화 함

cell = [[[UITableViewCell allocinitWithStyle:UITableViewCellStyleDefaultreuseIdentifier:MyIdentifier] autorelease];

}

// Set up the cell.

//timeZoneNames 배열의 인자로 받은 위치에 있는 문자열을 추출하고

NSString *timeZoneName = [timeZoneNames objectAtIndex:indexPath.row];

//추출한 문자열을 셀의 text 속성에 넣는다.

cell.textLabel.text = timeZoneName;

return cell;

}


/*

 To conform to Human Interface Guildelines, since selecting a row would have no effect (such as navigation), make sure that rows cannot be selected.

 */

//인자로 받은 tableView의 indexPath위치에 있는 cell이 선택되었음을 delegate에게 전달한다.

//이 예제에서는 cell 선택에 대한 내용을 처리하지 않으므로 그냥 nil을 리턴한다.

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {

return nil;

}


//메모리 해제

- (void)dealloc {

[timeZoneNames release];

[super dealloc];

}


@end


[Notice]
UITableView는 2개의 protocol을 구현하고 있는데
UITableViewDelegate는 테이블 뷰의 설정을 처리혹
UITableViewDataSource는 테이블 뷰의 각 행의 데이터를 처리한다.

블로그 이미지

마즈다

이제 반백이 되었지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

댓글을 달아 주세요

최초 작성일 : 2010/03/27 09:00 



SimpleTableViewAppDelegate.h

//애플리케이션의 delegate 클래스 NSObject를 상속받고 있으며

//UIApplicationDelegate 프로토콜을 구현한다.

@interface SimpleTableViewAppDelegate : NSObject <UIApplicationDelegate> {

//인스턴스 변수 선언

UIWindow *window;


//계층적 데이터간에 이동을 표현할 수 있도록 해주는 뷰 컨트롤러 클래스

UINavigationController *navigationController;

}


//접근자와 변경자를 자동 생성하도록 해주는 @property 키워드 선언

@property (nonatomicretainIBOutlet UIWindow *window;

@property (nonatomicretain) UINavigationController *navigationController;


@end




SimpleTableViewAppDelegate.m



//필요한 헤더파일들 import

#import "SimpleTableViewAppDelegate.h"

#import "RootViewController.h"


@implementation SimpleTableViewAppDelegate


//헤더파일의 @property 키워드와 조합되어 접근자 및 변경자를 자동 생성시켜줌

@synthesize window;

@synthesize navigationController;


//UIApplicationDelegate프로토콜에 선언된 함수

//애플리케이션 시작되었음을 delegate에게 알려주는 함수. 인자는 시작된 애플리케이션 객체

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

/*

Create and configure the navigation and view controllers.

뷰 컨트롤러의 인스턴스 생성. alloc으로 생성되었으므로 후에 release 필요

*/


RootViewController *rootViewController =

[[RootViewController allocinitWithStyle:UITableViewStylePlain];

// Retrieve the array of known time zone names, 

// then sort the array and pass it to the root view controller.

//time zone이름 목록을 가져와 배열에 담는다.

NSArray *timeZones = [NSTimeZone knownTimeZoneNames];


//localizedCaseInsensitiveCompare : NSString 함수. 인자로 들어오는 문자열에

        //대/소문자 구분 안함, 지역화함, 비교대상임을  표시하여 리턴한다.

//@selector : 특정 함수 이름을 인자로 받아 다른 객체 내에서 그 함수가 실행되도록 한다.

//현재 코드에서는 NSString 클래스의 함수인 localizedCaseInsensitiveCompare를 @selector를 통해

//NSArray의 인스턴스인 timeZones의 함수 sortedArrayUsingSelector가 배열 값들을 정렬한는데

//사용할 수 있도록 해준다.

//즉, sortedArrayUsingSelector 함수는 localizedCaseInsensitiveCompare 함수를 이용하여

//배열 값들을 정렬한다.

//sortedArrayUsingSelector : NSArray 클래스의 함수. selector를 통헤 재공되는 특정 비교 방식을 사용하여

//정렬된 배열을 리턴하는 함수

rootViewController.timeZoneNames = [timeZonessortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];

//네비게이션 뷰 컨트롤러 생성 역시 alloc을 통해 생성하였으므로 반드시 release해주어야 한다.

//initWithRootViewController : 새로 생성된 네비게이션 컨트롤러를 초기화 하여 반환한다. 

//인자는 네비게이션 스택의 가장 하부(가장 앞)에 존재하는 뷰 컨트롤러임.

UINavigationController *aNavigationController = [[UINavigationController alloc]initWithRootViewController:rootViewController];

self.navigationController = aNavigationController;

//alloc으로 생성한 인스턴스들 release

[aNavigationController release];

[rootViewController release];


// Configure and display the window.

//윈도우에 뷰를 추가하고 화면에 출력한다.

//addSubview : UIView클래스의 함수. receiver의 서브 뷰로 뷰를 추가하고 제일 위에 보여지도록 한다.

//makeKeyAndVisible : UIWindow클래스의 함수. 해당 윈도우를 가장 앞에서 사용자의 입력을 받는

        //key window로 만들고 이것을 화면에 출력한다.

[window addSubview:[navigationController view]];

[window makeKeyAndVisible];

}


//메모리 해제

- (void)dealloc {

[navigationController release];

    [window release];

    [super dealloc];

}

@end


블로그 이미지

마즈다

이제 반백이 되었지만 아직도 꿈을 좇고 있습니다. 그래서 그 꿈에 다가가기 위한 단편들을 하나 둘 씩 모아가고 있지요. 이 곳에 그 단편들이 모일 겁니다...^^

댓글을 달아 주세요