Обновление основных данных в didSelectRowAtIndexPath - PullRequest
1 голос
/ 24 августа 2011

Хорошо, я занимаюсь этим уже несколько дней и, похоже, не могу понять, что я делаю неправильно.

Я хочу, чтобы базовые данные обновлялись при выборе строки. Я получил это вниз, но затем я хочу обновить представление таблицы, чтобы отобразить изменения. Вот где у меня проблема. Я бегу:

    [NSFetchedResultsController deleteCacheWithName:@"Root"];
    fetchedResultsController = nil;
    NSError *error = nil;
    if(![[self fetchedResultsController] performFetch:&error]){

    }
    [[self tabVe] reloadData];

после обновления данных, но просмотр таблицы не обновляется. Я поменяю взгляды и вернусь, но это .. застряло. Я все еще могу прокручивать и выбирать больше строк, но таблица никогда не обновится. У меня есть сегментированный контроллер, и он прекрасно работает, изменяя данные так, как я хочу, но причина, по которой я говорю, что таблица зависает, заключается в том, что после выбора строки сегментированный контроллер не меняет содержимое таблицы, как это будет до того, как будет выбран ряд.

Я не делаю этого в режиме редактирования, я просто хочу обновить значение при выборе. Вот мой код:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [[self.fetchedResultsController sections] count];
}

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
    return [sectionInfo numberOfObjects];
}


    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        [self.tabVe deselectRowAtIndexPath:indexPath animated:YES];
        if(cyc == 1){
            UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
            if(cell.accessoryType == UITableViewCellAccessoryCheckmark){
                cell.accessoryType = UITableViewCellAccessoryNone;
            }else {
                cell.accessoryType = UITableViewCellAccessoryCheckmark;
                Items *anItem = [self.fetchedResultsController objectAtIndexPath:indexPath];
                anItem.need = @"0";
                NSError *error = nil;
                if(![managedObjectContext save:&error]){

                }
                [NSFetchedResultsController deleteCacheWithName:@"Root"];
                fetchedResultsController = nil;
                NSError *error = nil;
                if(![[self fetchedResultsController] performFetch:&error]){

                }
                [[self tabVe] reloadData];
            }
        }
    }

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
    NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = [[managedObject valueForKey:@"name"] description];
    cell.detailTextLabel.text = [[managedObject valueForKey:@"notes"] description];
    if([[managedObject valueForKey:@"need"] description] == @"0"){
        cell.accessoryType = UITableViewCellAccessoryNone;
    }else if([[managedObject valueForKey:@"need"] description] == @"1"){
        cell.accessoryType = UITableViewCellAccessoryNone;
    }
}

Я надеюсь, что кто-то может помочь мне понять это. cyc - NSInteger, показывающий текущую позицию сегментированного контроллера, в настоящее время я обновляю элемент только когда cyc равен 1.

Изменить:

Все идет гладко, пока

if(![managedObjectContext save:&error]){

}

запущен. После этого, кажется, стол застревает.

1 Ответ

3 голосов
/ 24 августа 2011

Просто догадываюсь, но на ум приходят две вещи:

  1. Попробуйте сократить код в didSelectRowAtIndexPath:, по моему опыту, достаточно просто установить fetchedResultsController вnil и пусть ленивая загрузка позаботится о получении.Другая идея - вообще не использовать кеш.Это стоило бы попробовать, безусловно, разумно, если бы оно не сказалось на производительности.

  2. Я заметил, что вы сравниваете две строки с ==.Я думаю, что вы должны использовать метод isEqualToString: для этого сравнения.Кроме того, я не уверен, зачем вам нужен метод description в дополнение к строке - description для NSString - это точно такая же строка.Попробуйте также упростить это.

Кроме того, из вашего кода не ясно, что такое переменная cyc и откуда она взята.Возможно, вы захотите выбрать более понятные человеку имена переменных.

...