0

设想:

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

问题:

我想要的是基本上对给定一周、一个月或一年的费用进行分类,并将其显示为部分标题标题,例如:(2012 年 10 月 1 日至 10 月 7 日),并据此显示费用金额和相关内容特定的一周。该视图中提供了两个按钮,如果我按下右侧按钮,它将一周增加一周(2012 年 10 月 1 日至 10 月 7 日现在显示 2012 年 10 月 8 日至 10 月 15 日),同样,左侧按钮将减少一周一个星期。

我的问题是我将如何实现上述目标。我写了一些伪代码 - 任何帮助将不胜感激。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(date == %@)", dateToFilterFor];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Expense" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setPredicate:predicate];

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"SomeCacheName"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;

为了按一周过滤它,谓词应该是什么?另外,我想在获取的结果控制器中有一个部分名称,但它会是什么?

4

1 回答 1

0

假设用户选择了 10 月 1 日和 10 月 7 日,

NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:@"MM/dd/yyyy"];

NSString *str1 = @"10/01/2012";
NSDate *date1 = [formatter dateFromString:str1];

NSString *str2 = @"10/07/2012";
NSDate *date2 = [formatter dateFromString:str2];

将其用作,

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(date >= %@) AND (date <= %@)", date1, date2];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Expense" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setPredicate:predicate];

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"SomeCacheName"];
aFetchedResultsController.delegate = self;
self.fetchedResultsController = aFetchedResultsController;

为了添加日期,

int addDaysCount = 7; //try with negative values for fetching previous week.

NSDateComponents *dateComponents = [[NSDateComponents alloc] init];
[dateComponents setDay:addDaysCount];

NSDate *newDate1 = [[NSCalendar currentCalendar] 
                              dateByAddingComponents:dateComponents 
                                              toDate:date1 options:0];
NSDate *newDate2 = [[NSCalendar currentCalendar] 
                              dateByAddingComponents:dateComponents 
                                              toDate:date2 options:0];

使用上述谓词newDate1newDate2来获取与这些日期相对应的新费用。

如果要获取特定一周的星期日,请使用NSDateComponents.

NSDateComponents *components = [NSDateComponents new]; 
components.weekday = 1;//represents sunday 
components.year = 2012; 
components.weekOfMonth = 1;
components.month = 10; //etc..

NSDate *date1 = [[NSCalendar currentCalendar] dateFromComponents: components]; 

有关其属性的更多详细信息,请检查NSDateComponents

于 2012-11-08T08:41:45.967 回答