更新 didSelectRowAtIndexPath 上的核心数据
Posted
技术标签:
【中文标题】更新 didSelectRowAtIndexPath 上的核心数据【英文标题】:Update Core Data on didSelectRowAtIndexPath 【发布时间】:2011-08-23 21:27:43 【问题描述】:好吧,我已经在这几天了,似乎无法弄清楚我做错了什么。
我想要的是在选择一行时更新核心数据。我把它记下来了,但是我希望刷新表格视图以显示更改。那就是我遇到问题的地方。我跑:
[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】:只是猜测,但想到了两件事:
根据我的经验,尝试减少didSelectRowAtIndexPath:
中的代码,只需将fetchedResultsController
设置为nil
并让延迟加载处理获取即可。另一个想法是根本不使用任何缓存。这值得一试,如果它不影响性能,当然是合理的。
我注意到您将两个字符串与==
进行比较。我认为您应该使用isEqualToString:
方法进行此比较。另外,我不确定为什么除了字符串之外还需要description
方法-NSString
的description
是完全相同的字符串。也试着简化一下。
此外,从您的代码中不清楚变量cyc
是什么以及它来自何处。您可能想要选择更易于人类理解的变量名称。
【讨论】:
感谢您的建议。不幸的是,将fetchedResultsController
设置为nil
并且不使用缓存并没有使表正常工作。另外,我本来打算用isEqualToString
,但完全忘记了,还是习惯了,所以谢谢你提醒我。不知道为什么我使用description
,我只是这样做。无论如何,感谢您的帮助/建议,但我仍然遇到同样的问题。
您是否将cacheName:nil
放入您的fetchedResultsController
的init
方法中?
是的,我将cacheName:nil
放入我的fetchedResultsController
的init
方法中。
我自己制定了解决方法。根本不是一个合适的,但它适合我的需要。我现在混合使用 sqlite3 和核心数据。我会将您的答案标记为已接受的答案,因为它帮助了我:)
谢谢。出了什么问题?以上是关于更新 didSelectRowAtIndexPath 上的核心数据的主要内容,如果未能解决你的问题,请参考以下文章