提取结果控制器在应用程序重置后才返回图像

时间:2014-01-16 04:37:29

标签: ios core-data nsfetchrequest

我有一个相当基本的应用程序,它从一个视图控制器获取输入并保存它,允许用户在单独的表视图控制器上查看数据。保存的数据不过是几个字符串和一个图像。一切都工作得很好,直到突然之间,我的图像不再出现在TableViewController中,直到应用程序重置为止。

我的表格视图设置了正确的部分数量和正确的单元格数量,其中显示的数据应该是应有的,唯一的例外是图像。

这是我的“保存到CoreData”代码:

- (IBAction)saveTarget:(id)sender {
    //Only save if there is an image other than the stock photo
    if (self.transfer.targetImage) {

        //Grab the main ManagedObjectContext from the AppDelegate
        sTCAppDelegate *appDelegate =[[UIApplication sharedApplication] delegate];
        NSManagedObjectContext *context =[appDelegate managedObjectContext];
        //Get the Target model from CoreData
        [self setTarget:[NSEntityDescription insertNewObjectForEntityForName:@"TargetData" inManagedObjectContext:context]];

        //Save the strings from the child view controller
        self.target.weaponData = self.transfer.weaponData;
        self.target.bulletType = self.transfer.bulletType;
        self.target.stanceType = self.transfer.stanceType;
        self.target.distanceData = self.transfer.distanceData;
        self.target.targetNotes = self.transfer.targetNotes;
        self.target.sightType = self.transfer.sightType;
        self.target.scoreData = self.transfer.scoreData;

        //Save the image from the child view controller
        self.target.targetImage = self.transfer.targetImage;

        //Save the range data from the preset values
        self.target.rangeName = self.name;
        self.target.rangeStreet = self.street;
        self.target.rangeCity = self.city;
        self.target.rangeState = self.state;

        //Set a date property to use for organizing by most recently saved
        NSDate *date = [NSDate date];
        NSDate *dateMod = [self dateAtBeginningOfDayForDate:date];
        self.target.timeStamp = dateMod;
        //Save a more user-friendly date string
        self.target.formattedTimeStamp = [self.dateFormatter stringFromDate:dateMod];

        //Save to context
        NSError *error = nil;
        if ( ![context save:&error] ){
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }

        //Pop to main menu
        [self.navigationController popToRootViewControllerAnimated:YES];

        //set images back to nil for next time AddTarget is opened
        self.target.targetImage = nil;
        NSLog(@"Data Saved");
    }
    //Return alert if user has not entered a photo
    else{
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"We're Sorry!" message:@"You must enter at least a photo to save target data." delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles:nil];
        [alert show];
    }
}

这是我的“从CoreData代码中检索”:

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    NSLog(@"number of sections:%lu",(unsigned long)[[self.fetchedResultsController sections] count]);
    return [[self.fetchedResultsController sections] count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
    NSLog(@"%lu", (unsigned long)[sectionInfo numberOfObjects]);
    return [sectionInfo numberOfObjects];
}

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
    return [[[sectionInfo objects] objectAtIndex:0] formattedTimeStamp];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    NSLog(@"Ran Cell Configure");
    [self configureCell:cell atIndexPath:indexPath];
    // Configure the cell...

    return cell;
}

-(void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath{

    TargetData *target = [self.fetchedResultsController objectAtIndexPath:indexPath];
    UIImage *image = [self resizeImage:[UIImage imageWithData:target.targetImage] toWidth:50 andHeight:50];
    cell.imageView.image = image;
    cell.textLabel.text = [NSString stringWithFormat:@"%@", target.scoreData];
    cell.detailTextLabel.text = target.weaponData;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        sTCAppDelegate *appDelegate =[[UIApplication sharedApplication] delegate];
        NSManagedObjectContext *context =[appDelegate managedObjectContext];

        [context deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];

        NSError *error;
        if (![context save:&error]) {
            /*
             Replace this implementation with code to handle the error appropriately.

             abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
             */
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }
    }
}
#pragma mark- Fetched Objects Delegate

- (NSFetchedResultsController *)fetchedResultsController {
    if (_fetchedResultsController != nil)
    {
        return _fetchedResultsController;
    }
    sTCAppDelegate *appDelegate =[[UIApplication sharedApplication] delegate];
    NSManagedObjectContext *context =[appDelegate managedObjectContext];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"TargetData" inManagedObjectContext:context];

    [fetchRequest setEntity:entity];
    [fetchRequest setFetchBatchSize:0];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:NO];
    NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];

    [fetchRequest setSortDescriptors:sortDescriptors];

    NSFetchedResultsController *aFetchedRequestsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:@"timeStamp" cacheName:nil];
    aFetchedRequestsController.delegate = self;
    self.fetchedResultsController = aFetchedRequestsController;

    NSError *error = nil;

    if (![self.fetchedResultsController performFetch:&error])
    {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return _fetchedResultsController;
}

- (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 {

    UITableView *tableView = self.tableView;

    switch(type) {

        case NSFetchedResultsChangeInsert:
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
                             withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                             withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeUpdate:
            [self configureCell:[tableView cellForRowAtIndexPath:indexPath]
                    atIndexPath:indexPath];
            break;

        case NSFetchedResultsChangeMove:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
                             withRowAnimation:UITableViewRowAnimationFade];
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
                             withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}


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

1 个答案:

答案 0 :(得分:0)

这行代码有效地将图像设置为nil在对象上。

//set images back to nil for next time AddTarget is opened
self.target.targetImage = nil;

也许你应该这样做

self.target = nil;