- (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;
}
// 테이블 뷰의 편집기능을 위해 오버라이드 합니다.
- (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) {
}
}
// 테이블 뷰에서 줄이 선택될 수 있도록 오버라이드 합니다.
- (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];
}
}
- (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];
}