2015-07-21 56 views
0

我的任务对于大多数人来说基本上都很简单,但显然我在这里做错了什么。如何呈现空单元格?

我有两个表视图控制器,我想根据一些对象状态来填充它们的单元格。我正在处理核心数据,所以也做fetchResultController

在其中一个视图控制器中,我可以更改单元格对象的状态(不是实际的单元格,填充单元格的对象),每当发生这种情况时,我想从表格视图中删除此单元格。在该视图控制器中,我只想呈现填充它们的对象具有status = 0的单元格。但我不想删除那些被删除的,只是为了更改他们的​​,然后在其他视图控制器中显示它们,如果他们有status = 1

那么什么IM做的是:

每当commitEditingStyle获取调用:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 

    if (editingStyle == UITableViewCellEditingStyleDelete) { 
     Target *target = [self.fetchedResultController objectAtIndexPath:indexPath]; 

     target.status = @1; 
    } 

    if ([_delegate respondsToSelector:@selector(didDeleteObject)]) { 
     [self fetchData]; 
     [_delegate didDeleteObject]; 
    } 

} 

现在我脑子里想的是在cellForRowAtIndexPath方法来添加时,即时通讯回这样的小区的条件:

if ([target.status isEqual:@0]) { 
     return cell; 
    } 
    return NULL; 
} 

,因为我想提出只有有身份的0细胞...

所以现在显然我不能进入这个表视图,因为我必须在这个方法中返回一个单元格而没有完成,我怎么才能说,如果对象目标的雕像不是1,所以不显示单元格?

其他代码的解决方案将是巨大的:)

感谢!

回答

0

你应该能够过滤掉了读取请求谓词

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Target"]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"status == %@", [NSNumber numberWithBool:NO]]; 
[fetchRequest setPredicate:predicate]; 

当您将status属性设置为1时,FetchedResultsController将自动从tableView中删除单元格,但该对象不会被删除。您不必在cellForRowAtIndexPath中做任何事情。在你的其他tableView中,设置谓词只能获取status == 1。 另外,请确保在更改属性值时保存managedObjectContext。

Target *target = [self.fetchedResultController objectAtIndexPath:indexPath]; 

target.status = @1; 

NSError *error = nil; 
    if (![self.managedObjectContext save:&error]) { 
     NSLog(@"Save Failed! %@ %@", error, [error localizedDescription]); 
    } 
+0

真棒兄弟!这是有效的,只是一件小事 - 当我终止应用程序并再次运行它时,我确实看到与之前删除的状态1相同的对象...我在哪里说我要获取的状态为0 ..? –

+0

@nickshmick很高兴工作!它应该在FRC委托方法' - (NSFetchedResultsController *)fetchedResultsController'中。另外,当你删除时,你保存了'managedObjectContext'吗?理想情况下,如果设置正确,FRC应该在添加,删除,更新等时为您自动更新tableView。检查这个[教程](http://code.tutsplus.com/tutorials/core-data-from-scratch-nsfetchedresultscontroller--cms-21681)如何使用FRC。这真的很有帮助! – SFF

+0

我在调用viewDidLoad中的fetchData。是的,当我删除tableView中的对象commitEditingStyle即时做CoreDataStack * stack = [CoreDataStack defaultStack];然后[stack saveContext] –

0

你不能这样做。

你必须设置一个动态numberOfRowsInSection:,取决于Target多少有status属性等于@0 所以,在tableView:cellForRowAtIndexPath:你只会如果状态@0返回小区。

对于我来说,如果将dataSource中的dataSource与target.status = @0等分开,那么效果会更好。

正确的方式是这样的

// This is the point where you have an update dataSource array (not splitted) 
updatedDatas = [Manager getLatestData]; 
if (dataSource.count > 0) 
    [dataSource removeAllObjects]; 

[updatedDatas enumerateObjectsUsingBlock:^(Target *obj, NSUInteger idx, BOOL *stop) { 
    if ([obj.status integerValue] == 0) 
     [dataSource addObject: obj]; 
}]; 
updatedDatas = nil; 

// This is the numberOfRowsInSection: 
- (NSInterger)numberOfRowsInSection:(NSInteger)section{ 
    return dataSource.count; 
} 

tableView:cellForRowAtIndexPath:您现在将使用数据源NSMutableArray用一个简单的objectAtIndex:访问正确的元素

+0

我想试试你的建议,分裂dataSorce。所以我认为在viewDidLoad中,我将从fetch结果控制器中获取状态为0的对象,并将它们复制到本地数组调用statusZeroObjects(例如),并在tableView:cellForRowAtIndexPath中使用此数组。但是当我想如果在tableView:cellForRowAtIndexPath方法im从nsfetchresultcontroller获取对象,我不能只有获取属性状态值为0的对象吗? –

+0

您可以不拆分数据源,但是您总是必须检查数组中的当前元素是否具有'status' = @ 0。我认为如果你分割一次dataSource,然后使用它,而不总是检查一个条件是真还是假,那会更好。 –

+0

好的,那么你可以添加for循环,或者如果有其他方法只复制状态为0的对象吗?我虽然有些东西,但语法是错误的。像if(int i = 0; i