2014-05-18 3 views
0

사용자가 셀을 터치하여 작업을 확인/선택 취소 할 수있는 간단한 할일 앱이 있습니다. 하지만 코어 데이터를 부울 값을 yes로 설정하여 업데이트하는 방법을 잘 모르겠습니다.UITableViewCell touch에서 핵심 데이터 개체 업데이트

여기 내 코드입니다 :

// PakkelisteViewController.m // Sommerleir

// // // 08.05.14에 로니 - 앙드레 Bendiksen 작성. // Copyright (c) 2014 Arbeidernes Ungdomsfylking. 판권 소유. //

#import "PakkelisteViewController.h" 
#import "AUFToDoItem.h" 
#import "TodoCell.h" 

@interface PakkelisteViewController() 

@property NSMutableArray *toDoItems; 
-(IBAction)addNewToDoItem; 

@end 

@implementation PakkelisteViewController 

- (id)initWithStyle:(UITableViewStyle)style 
{ 
    self = [super initWithStyle:style]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.toDoItems = [[NSMutableArray alloc] init]; 
    [self loadInitialData]; 

    // Uncomment the following line to preserve selection between presentations. 
    // self.clearsSelectionOnViewWillAppear = NO; 

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller. 
    // self.navigationItem.rightBarButtonItem = self.editButtonItem; 
} 

-(void)viewWillAppear:(BOOL)animated 
{ 
    // Fetch the devices from persistent data store 
    NSManagedObjectContext *managedObjectContext = [self managedObjectContext]; 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"AUFToDoItem"]; 
    self.toDoItems = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy]; 

    [self.tableView reloadData]; 
} 

-(void)loadInitialData 
{ 
    // check if user has already been using this functionality 
    BOOL hasRunBefore = [[NSUserDefaults standardUserDefaults] boolForKey:@"PakkelisteHasRun"]; 

    if (!hasRunBefore) 
    { 
     NSLog(@"Has not run"); 

     [self.toDoItems addObjectsFromArray:@[@"Badetøy", @"Skrivesaker", @"Lommepenger", @"Godt humør"]]; 

     [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"PakkelisteHasRun"]; 
     [[NSUserDefaults standardUserDefaults] synchronize]; 
    } 
    else 
    { 
     NSLog(@"Already run"); 
    } 
} 

-(IBAction)addNewToDoItem 
{ 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Legg til ny" message:nil delegate:self cancelButtonTitle:@"Avbryt" otherButtonTitles:@"Legg til", nil]; 
    [alertView setAlertViewStyle:UIAlertViewStylePlainTextInput]; 

    [[alertView textFieldAtIndex:0] setPlaceholder:@"Rent undertøy"]; 
    [[alertView textFieldAtIndex:0] setAutocapitalizationType:UITextAutocapitalizationTypeSentences]; 

    [alertView show]; 
} 

-(BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView 
{ 
    NSString *inputText = [[alertView textFieldAtIndex:0] text]; 

    if ([inputText length] > 0) 
    { 
     return YES; 
    } 
    else 
    { 
     return NO; 
    } 
} 

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if (buttonIndex == 1) 
    { 
     NSManagedObjectContext *context = [self managedObjectContext]; 

     // Create a new managed object 
     NSManagedObject *toDoItem = [NSEntityDescription insertNewObjectForEntityForName:@"AUFToDoItem" inManagedObjectContext:context]; 
     [toDoItem setValue:[alertView textFieldAtIndex:0].text forKey:@"itemName"]; 
     [toDoItem setValue:[NSDate date] forKey:@"creationDate"]; 
     [toDoItem setValue:[NSNumber numberWithBool:YES] forKey:@"completed"]; 

     [self.toDoItems addObject:toDoItem]; 

     NSError *error = nil; 
     // Save the object to persistent store 
     if (![context save:&error]) { 
      NSLog(@"Can't Save! %@ %@", error, [error localizedDescription]); 
     } 

     [self dismissViewControllerAnimated:YES completion:nil]; 

     [self.tableView reloadData]; 
    } 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

#pragma mark - Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    // Return the number of sections. 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    // Return the number of rows in the section. 
    return self.toDoItems.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellIdentifier = @"Cell"; 

    TodoCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    if (cell == nil) 
    { 
     cell = [[TodoCell alloc] init]; 
    } 

    NSManagedObject *toDoItem = [self.toDoItems objectAtIndex:indexPath.row]; 

    cell.title.text = [toDoItem valueForKey:@"itemName"]; 

    if ([[toDoItem valueForKey:@"completed"] boolValue] == 1) 
    { 
     cell.checkbox.image = [UIImage imageNamed:@"checkbox_on.png"]; 
    } 
    else 
    { 
     cell.checkbox.image = [UIImage imageNamed:@"checkbox_on.png"]; 
    } 

    return cell; 
} 

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

    /* 
    [tableView deselectRowAtIndexPath:indexPath animated:NO]; 

    AUFToDoItem *tappedItem = [self.toDoItems objectAtIndex:indexPath.row]; 
    tappedItem.completed = !tappedItem.completed; 

    [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]; 
    */ 
} 

-(NSManagedObjectContext *)managedObjectContext { 
    NSManagedObjectContext *context = nil; 
    id delegate = [[UIApplication sharedApplication] delegate]; 
    if ([delegate performSelector:@selector(managedObjectContext)]) { 
     context = [delegate managedObjectContext]; 
    } 
    return context; 
} 


// Override to support conditional editing of the table view. 
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Return NO if you do not want the specified item to be editable. 
    return YES; 
} 

// Override to support editing the table view. 
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSManagedObjectContext *context = [self managedObjectContext]; 

    if (editingStyle == UITableViewCellEditingStyleDelete) { 

     [context deleteObject:[self.toDoItems objectAtIndex:indexPath.row]]; 

     NSError *error = nil; 
     if (![context save:&error]) 
     { 
      NSLog(@"Can't delete! %@ %@", error, [error localizedDescription]); 
      return; 
     } 

     [self.toDoItems removeObjectAtIndex:indexPath.row]; 
     [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } 
} 

/* 
// Override to support rearranging the table view. 
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath 
{ 
} 
*/ 

/* 
// Override to support conditional rearranging of the table view. 
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Return NO if you do not want the item to be re-orderable. 
    return YES; 
} 
*/ 

/* 
#pragma mark - Navigation 

// In a storyboard-based application, you will often want to do a little preparation before navigation 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    // Get the new view controller using [segue destinationViewController]. 
    // Pass the selected object to the new view controller. 
} 
*/ 

@end 
+0

코어 데이터 문서에서 쉽게 찾아 볼 수있는 것처럼 지금까지 시도한 것을 말해 줄 수 있습니다. 코드의 기본 논리는 셀 선택 처리, 업데이트 할 객체 가져 오기, 관련 속성 업데이트, 컨텍스트 저장과 같습니다. – Calvedos

+3

NSFetchedResultsController 구현은 좋은 옵션이 될 것이며 섹션 및 행 삽입, 업데이트 및 삭제를 처리합니다. – Jonathan

+0

@Jonathan Apple 설명서가 다소 혼란 스럽습니다. 이 튜토리얼이나 비디오를 잘 아십니까? –

답변

0

변경 :

tappedItem.completed = !tappedItem.completed; 

에 : 최소한의 코드를 풀고과 NSNumber 인스턴스에서 부울 값의 포장을 다시입니다

tappedItem.completed = @(![tappedItem.completed boolValue]); 

.

또한 if 문에서 BOOL 값이 == 1인지 확인하지 마십시오. 그 이유는 반드시 그렇지 않을 수도 있기 때문입니다. 그냥 말 :

if ([tappedItem.completed]) { ... 

당신은 또한 당신이 사용하고있는 체크 박스 이미지의 이름에 오타가 나타납니다.

0

코드 상태를 업데이트하여 tableView:tableView didSelectRowAtIndexPath:에있는 셀을 업데이트하면 어떻게 될까요? 또한, 의 의미를 설명 할 수 있습니까?하지만 코어 데이터를 부울 값을 yes로 설정하여 업데이트하는 방법을 잘 모르겠습니다.?

관리 대상 개체의 상태를 업데이트 한 후 save 사용중인 컨텍스트가 있으면 전체 테이블이나 특정 인덱스 경로에서 다시로드 할 수 있습니다.

BOOL hasTap = ![tappedItem.completed boolValue]; 
tappedItem.completed = @(hasTap); // or [NSNumber numberWithBool:hasTap]; 

// save 

// reload 

저는 실제로 Jonathan의 의견을 따르고 있습니다. NSFetchedResultsControllerUITableViews (또는 UICollectionViews)와 일치해야합니다. 델리게이트 NSFetchedResultsControllerDelegate을 설정하여 행 (및 섹션) 삽입, 삭제, 이동을 수신하고 처리 할 수 ​​있습니다.

튜토리얼은 Core Data Tutorial for iOS: How To Use NSFetchedResultsController입니다.

관련 문제