2010-02-08 62 views
1

我一直在研究一個列表應用程序,其中核心數據用於堅持一個檢查標記一切都很好,直到xcode崩潰。沒有代碼被更改,但現在,而不是立即出現的複選標記,您必須單擊該行,退出應用程序,然後重新啓動以獲取任何內容。這是代碼以及我如何獲得代碼的另一個問題。 How can a checkmark state be saved in core data?爲什麼我的布爾值存儲在覈心數據不立即顯示?

任何幫助,非常感謝。謝謝

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSManagedObject *selectedObject = [self.fetchedResultsController objectAtIndexPath:indexPath]; 


    if ([[selectedObject valueForKey:@"check"] boolValue]) { 
     [selectedObject setValue:[NSNumber numberWithBool:NO] forKey:@"check"]; 
    } else { 
     [selectedObject setValue:[NSNumber numberWithBool:YES] forKey:@"check"]; 
    } 
} 


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

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:defaultCellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:defaultCellIdentifier] autorelease]; 
    } 

    NSManagedObject *item = [[self fetchedResultsController] objectAtIndexPath:indexPath]; 
    cell.textLabel.text = [item valueForKey:@"name"]; 

    if ([[item valueForKey:@"check"] boolValue]) { 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } else { 
     cell.accessoryType = UITableViewCellAccessoryNone; 
    } 

    cell.selectionStyle = UITableViewCellSelectionStyleNone; 

    return cell; 
} 



-(UITableViewCellAccessoryType)tableView:(UITableView *)tableView accesoryTypeForRowWithInddexPath:(NSIndexPath *)indexPath { 
    return UITableViewCellAccessoryNone; 
} 
+0

您是否保存上下文? – 2011-01-22 04:24:40

回答

2

您是否實現了必要的NSFetchedResultsControllerDelegate方法來捕獲數據模型的更新?如果不是,你的表不知道更新行的視覺狀態。一些樣板代碼如下:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller 
{ 
    [self.tableView beginUpdates]; 
} 

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type 
{ 
    switch(type) 
    { 
     case NSFetchedResultsChangeInsert: 
     { 
      [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
     }; break; 

     case NSFetchedResultsChangeDelete: 
     { 
      [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
     }; break; 
    } 
} 

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath 
{ 
    switch(type) 
    { 
     case NSFetchedResultsChangeInsert: 
     { 
      // This works around problems with inserting a row at the beginning of the list 
      [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:(newIndexPath.row + 1) inSection:newIndexPath.section]] withRowAnimation:UITableViewRowAnimationFade]; 
     }; break; 

     case NSFetchedResultsChangeDelete: 
     { 
      if (self.tableView.editing) 
       [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:(indexPath.row + 1) inSection:indexPath.section]] withRowAnimation:UITableViewRowAnimationFade]; 
      else 
       [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
     }; break; 

     case NSFetchedResultsChangeUpdate: 
     { 
      [self updateCell:[self.tableView cellForRowAtIndexPath:indexPath] fromCategory:[fetchedResultsController objectAtIndexPath:indexPath]]; 
     }; break; 

     case NSFetchedResultsChangeMove: 
     { 
      [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:newIndexPath.section] withRowAnimation:UITableViewRowAnimationFade]; 
     }; break; 
    } 
} 

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{ 
    [self.tableView endUpdates]; 
} 
+0

是的,原來在最新的xcode中有一個錯誤提供了一個斷言錯誤。爲了解決它,我只需在舊的xcode上運行應用程序。 – Tanner 2010-02-09 15:47:28

+0

@坦納 - 如果是這樣的話,爲什麼不把它作爲答案發布,然後選擇它呢? – Moshe 2011-03-25 14:29:02

0

您的核心數據模型是否有「默認值」? 也許它已被設置爲「否」而不是「是」。

+0

你好,它的設置都不是那些。上次它完美的工作。除了代碼未解決之外,我不知道自從崩潰以來發生了什麼變化。 – Tanner 2010-02-08 21:29:05

+0

爲什麼會這樣?人們會認爲在用戶檢查之前,默認值是NO(未選中)(YES)。這不是一個諷刺評論,它是一個嚴肅的問題......它爲什麼會有所作爲? – 2011-01-22 04:23:41

相關問題