gpt4 book ai didi

ios - 带有部分名称的 NSFetchedResultsController

转载 作者:行者123 更新时间:2023-12-01 17:21:08 24 4
gpt4 key购买 nike

设想:

我有一个费用跟踪 iOS 应用程序,我将费用从费用详细 View Controller 存储到 TableView (带有获取的结果 Controller )中,该 TableView 显示费用列表以及类别、金额和日期。我的实体“Money”中确实有一个日期属性,它是支出或收入的父实体。

我的问题:

我想要的是基本上对给定一周、一个月或一年的费用/收入进行分类,并将其显示为部分标题标题,例如:(2012 年 10 月 1 日至 10 月 7 日),它显示费用/收入金额和相关根据那一周的东西。该 View 中提供了两个按钮,如果我按下右侧按钮,它将一周增加一周(2012 年 10 月 1 日至 10 月 7 日现在显示 2012 年 10 月 8 日至 10 月 15 日),同样,左侧按钮将减少一周一个星期。我在 View 中也有两个段控件。我想要做的是按下显示“每周”的段控制,如果我按下另一个显示“类别”的段 - 我将如何根据类别过滤掉我每周的费用/收入?

我想在我的表格 View 中显示两个部分(一个显示费用日期,另一个显示格式的收入日期(2012 年 10 月 1 日 - 2012 年 10 月 7 日))。我将如何实现这一目标?我写了一些伪代码,如果有人能告诉我如何完成上述操作,那就太好了。

编辑 - 获取 Controller

- (void)userDidSelectStartDate:(NSDate *)startDate andEndDate:(NSDate *)endDate
{
AppDelegate * applicationDelegate = (AppDelegate *) [[UIApplication sharedApplication] delegate];
NSManagedObjectContext * context = [applicationDelegate managedObjectContext];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Money" inManagedObjectContext:context];
[fetchRequest setEntity:entity];

[NSFetchedResultsController deleteCacheWithName:nil];

//Here you create the predicate that filters the results to only show the ones with the selected date
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(date >= %@) AND (date <= %@)", startDate, endDate];
[fetchRequest setPredicate:predicate];

// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];

// Edit the sort key as appropriate.

NSSortDescriptor * sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"type" ascending:YES];

NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];

NSSortDescriptor *sortDescriptor3 = [[NSSortDescriptor alloc] initWithKey:@"cat" ascending:YES];

NSArray * descriptors = [NSArray arrayWithObjects:sortDescriptor1, sortDescriptor2, sortDescriptor3, nil];

[fetchRequest setSortDescriptors:descriptors];
[fetchRequest setIncludesSubentities:YES];
[fetchRequest setResultType:NSManagedObjectResultType];

if(_fetchedResultsController)
{
[_fetchedResultsController release]; _fetchedResultsController = nil;

}
// Edit the section name key path and cache name if appropriate.
// nil for section name key path means "no sections".
_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:@"type" cacheName:nil];

_fetchedResultsController.delegate = self;

NSError *anyError = nil;

if(![_fetchedResultsController performFetch:&anyError])
{
NSLog(@"error fetching:%@", anyError);
}

[sortDescriptor1 release];
[sortDescriptor2 release];
[sortDescriptor3 release];

[fetchRequest release];

//Finally you tell the tableView to reload it's data, it will then ask your NEW FRC for the new data
[self.dashBoardTblView reloadData];

}

编辑 - 获取 Controller 委托(delegate)方法
- (void)controllerWillChangeContent:(NSFetchedResultsController*)controller
{
[self.dashBoardTblView beginUpdates];

}


- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type {

switch(type) {
case NSFetchedResultsChangeInsert:
[self.dashBoardTblView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex]
withRowAnimation:UITableViewRowAnimationFade];
break;

case NSFetchedResultsChangeDelete:
[self.dashBoardTblView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex]
withRowAnimation:UITableViewRowAnimationFade];
break;
}
}

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath{

switch(type) {
case NSFetchedResultsChangeInsert:

[self.dashBoardTblView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;

case NSFetchedResultsChangeDelete:

[self.dashBoardTblView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;

case NSFetchedResultsChangeMove:

[self.dashBoardTblView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
[self.dashBoardTblView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
withRowAnimation:UITableViewRowAnimationFade];


break;

case NSFetchedResultsChangeUpdate:
{
[self.dashBoardTblView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
[self.dashBoardTblView endUpdates];
}

最佳答案

要将“费用”/“收入”对象分组到不同的部分,您需要添加 type Money 的属性实体,例如 Integer 0 的属性费用和1为收入。

要按类型(费用/收入)对 TableView 部分进行排序,请使用 type作为第一排序描述符:

NSSortDescriptor *s1 = [[NSSortDescriptor alloc] initWithKey:@"type" ascending:YES];

要按日期对每个部分中的条目进行排序,请使用 date作为第二个排序描述符:
NSSortDescriptor *s2 = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];

NSArray *descriptors = [NSArray arrayWithObjects:s1, s2, nil];
[fetchRequest setSortDescriptors:descriptors];

最后,要将表格 View 按类别分组,请使用 typesectionNameKeyPath :
NSFetchedResultsController *aFetchedResultsController =
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:context
sectionNameKeyPath:type
cacheName:nil];

这应该给出 2 个部分,第一部分包含所有费用,第二部分包含所有收入。

现在对于部分标题,您必须实现 tableView:viewForHeaderInSection: (我希望我做对了):
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
Money *money = [[sectionInfo objects] objectAtIndex:0]; // The first object in this section
NSNumber *type = money.type;
if (type.intValue == 0) {
// Create and return header view for "expense" section.

} else {
// Create and return header view for "incomes" section.

}
}

关于ios - 带有部分名称的 NSFetchedResultsController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13302063/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com