본문 바로가기

프로그래밍/아이폰 프로그래밍

20. UITableView 데이터 편집 및 삭제

이번에는 테이블에 있는 데이터를 편집, 삭제 해보겠습니다.





1. 편집 버튼을 루트 뷰에 추가하세요.

RootViewController.m

- (void)viewDidLoad {

    [super viewDidLoad];


// 종료 이벤트를 노티피케이션 센터에 등록합니다.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillTerminate:) name:UIApplicationWillTerminateNotification object:nil];


NSString *path = [[NSBundle mainBundle] pathForResource:@"DrinkDirections" ofType:@"plist"];

NSMutableArray *tmpArray = [[NSMutableArray alloc] initWithContentsOfFile:path];

self.drinks = tmpArray;

[tmpArray release];

self.navigationItem.rightBarButtonItem = self.addButtonItem;

// UITabelViewcontroller 편집 버튼을 내장하고 있습니다.

// 코드를 넣으면 내비게이션 바에 편집 버튼이 나타납니다.

self.navigationItem.leftBarButtonItem = self.editButtonItem;

}








2. tableView:commitEditingStyle:forRowAtIndexPath 메소드를 구현 합니다.

// 테이블 뷰의 편집기능을 위해 오버라이드 합니다.

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{

if (editingStyle == UITableViewCellEditingStyleDelete) {

// 데이터 소스에서 해당 항목 삭제

[self.drinks removeObjectAtIndex:indexPath.row];

[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

}

else if( editingStyle == UITableViewCellEditingStyleInsert) {

}


}









3. 편집모드 창을 띄울수 있게 didSelectRowAtIndexPath:  를 수정합니다.


// 테이블 뷰에서 줄이 선택될 있도록 오버라이드 합니다.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    

/*

*detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];

     // ...

     // Pass the selected object to the new view controller.

[self.navigationController pushViewController:detailViewController animated:YES];

[detailViewController release];

*/

if (!self.editing) {

DrinkDetailViewController *drinkDetailViewController = [[DrinkDetailViewController alloc] initWithNibName:@"DrinkDetailViewController" bundle:nil];

drinkDetailViewController.drink = [self.drinks objectAtIndex:indexPath.row];

[self.navigationController pushViewController:drinkDetailViewController animated:YES];

[drinkDetailViewController release];

}

else {

// 편집 모드 일때는 칵테일 추가 뷰를 만들고 선택된 칵테일의 내용으로 채운 후에 편집할 있도록 합니다.

AddDrinkViewController *editingDrinkVC = [[AddDrinkViewController alloc] initWithNibName:@"DrinkDetailViewController" bundle:nil];

UINavigationController *editingNavCon = [[UINavigationController alloc] initWithRootViewController:editingDrinkVC];

editingDrinkVC.drink = [self.drinks objectAtIndex:indexPath.row];

editingDrinkVC.drinkArray = self.drinks;

[self.navigationController presentModalViewController:editingNavCon animated:YES];

[editingDrinkVC release];

[editingNavCon release];

}


}








4. 인터페이스 빌더에게 테이블 뷰가 편집될 수 있다는 것을 알려줍니다.


" Allow Selection While Editing " 체크 박스를 선택하세요.







5. 추가 뷰에게 편집 기능을 추가합니다.

AddDrinkViewController.m

- (void) viewWillAppear:(BOOL)animated {

[super viewWillAppear:(BOOL)animated];

NSLog(@"Registering for keyboard events");

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];

keyboardVisible = NO;

// 편집 모드라면 현재 가지고 있는 데이터를 뿌려준다.

if (self.drink != nil) {

nameTextField.text = [self.drink objectForKey:NAME_KEY];

ingredientsTextView.text = [self.drink objectForKey:INGR_KEY];

directionsTextView.text = [self.drink objectForKey:DIRE_KEY];

}

}



- (IBAction) save: (id)sender{

if (drink != nil) {

// 기존 칵테일에 대해서 편집을 하는 경우이므로 배열에서 이전 객체를 지우고 새로 추가합니다.

[drinkArray removeObject:drink];

self.drink = nil;

}

// 사용자가 입력한 정보를 새롭게 칵테일 정보 딕셔너리를 생성합니다.

NSMutableDictionary* newDrink = [[NSMutableDictionary alloc] init];

[newDrink setValue:nameTextField.text forKey:NAME_KEY];

[newDrink setValue:ingredientsTextView.text forKey:INGR_KEY];

[newDrink setValue:directionsTextView.text forKey:DIRE_KEY];

// 딕셔너리를 칵테일 배열이 담긴 배열에 추가합니다.

[drinkArray addObject:newDrink];

[newDrink release];

// 데이터를 정렬합니다.

// 칵테일 이름을 기준으로 정렬

// selector 별도로 지정하지 않으면 대소문자 구분해 비교를 합니다. 여기서는 대소문자 구분하지 않습니다.

NSSortDescriptor *nameSorter = [[NSSortDescriptor alloc] initWithKey:NAME_KEY ascending:YES selector:@selector(caseInsensitiveCompare:)];

[drinkArray sortUsingDescriptors:[NSArray arrayWithObject:nameSorter]];

[nameSorter release];

// 칵테일 추가 뷰를 제거

[self dismissModalViewControllerAnimated:YES];

}