Почему мое логическое значение, хранящееся в Базовых данных, не отображается сразу? - PullRequest
1 голос
/ 08 февраля 2010

Я работал над приложением со списком, в котором основные данные используются для сохранения галочки. Все было нормально, пока xcode не рухнул. Код не был изменен, но теперь вместо того, чтобы сразу отображалась галочка, нужно щелкнуть строку, выйти из приложения, а затем снова запустить его, чтобы получить что-либо. Это код вместе с другим вопросом о том, как я получил код в первую очередь. Как сохранить состояние галочки в основных данных?

Любая помощь очень ценится. Спасибо

- (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;
}

Ответы [ 2 ]

2 голосов
/ 09 февраля 2010

Реализованы ли вы необходимые методы 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 голосов
/ 09 февраля 2010

Имеет ли ваша базовая модель данных значение по умолчанию? Возможно, было установлено значение «НЕТ» вместо «ДА».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...