繁体   English   中英

更新didSelectRowAtIndexPath上的核心数据

[英]Update Core Data on didSelectRowAtIndexPath

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

我要的是选择一行时要更新的核心数据。 我记下了,但是然后我想要刷新表视图以显示更改。 那就是我遇到的问题。 我跑:

    [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. 尝试减少didSelectRowAtIndexPath:的代码didSelectRowAtIndexPath:以我的经验,只需将fetchedResultsController设置为nil并让延迟加载处理提取就足够了。 另一个想法是根本不使用任何缓存。 如果不影响性能,那将是值得尝试的选择,当然是合理的。

  2. 我注意到您正在将两个字符串与==进行比较。 我认为您应该使用isEqualToString:方法进行此比较。 另外,我不确定为什么除了字符串之外还需要description方法NSStringdescription是完全相同的字符串。 也尝试简化此过程。

另外,从您的代码中还不清楚变量cyc是什么以及它来自何处。 您可能想要选择更多人类可以理解的变量名。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM