更新didSelectRowAtIndexPath上的核心数据

时间:2011-08-23 21:27:43

标签: ios uitableview core-data didselectrowatindexpath

好吧,我已经好几天了,似乎无法弄清楚我做错了什么。

我想要的是在选择行时要更新的核心数据。我把它搞定了,但后来我希望表视图刷新以显示更改。这就是我遇到问题的地方。我跑:

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

    }
    [[self tabVe] reloadData];

更新数据后,但tableview不更新。我会改变观点并回来,但它被卡住了。我仍然可以滚动并选择更多行,但表永远不会刷新。我有一个分段控制器,它以我想要的方式改变数据很有效,但是我说表卡被卡住的原因是因为在我选择一行之后,分段控制器不会改变表的内容就像它一样会选择一行。

我不是在编辑模式下这样做,我只是想让它更新被选中的值。这是我的代码:

- (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 个答案:

答案 0 :(得分:3)

只是猜测,但有两件事情浮现在脑海中:

  1. 根据我的经验,尝试减少didSelectRowAtIndexPath:中的代码,只需将fetchedResultsController设置为nil并让延迟加载处理取件就足够了。另一个想法是根本不使用任何缓存。这值得一试,如果没有达到性能,肯定是合理的。

  2. 我注意到您正在将两个字符串与==进行比较。我认为您应该使用isEqualToString:方法进行此比较。此外,我不确定为什么除了字符串之外还需要description方法 - description的{​​{1}}是完全相同的字符串。尽量简化这一点。

  3. 此外,从您的代码中不清楚变量NSString是什么以及它来自何处。您可能希望选择更易于理解的变量名称。