在节标题中显示返回的值

时间:2012-04-30 08:18:04

标签: objective-c ios xcode core-data nsdate

我正在开发一种费用跟踪器类型的应用程序。我能够使用coredata完美地存储和检索已排序的数据。

我正在存储date.i能够按排序顺序检索日期。但是我想要在该表中的日期和该表中的相关数据。

例如:   2011年12月31日--------->部分标题
               xxxxxxx yyyyyy ----->带标签的单元格

2012年1月1日---------->章节标题
                xxxxxxx yyyyyy ------>带标签的单元格。

我能够按排序顺序接收日期。但是如何在排序顺序的节头中显示它们以及如何在tableView-noOfSections方法中声明节数?

//用于检索数据的代码。

- (void)viewDidLoad
{

AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSEntityDescription *entityDesc = [NSEntityDescription entityForName:@"NewExpense" inManagedObjectContext:context];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
NSSortDescriptor *date = [[NSSortDescriptor alloc]initWithKey:@"date" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:date,nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[fetchRequest setEntity:entityDesc];
NSError *error;
self.listOfExpenses = [[context executeFetchRequest:fetchRequest error:&error]retain]    [fetchRequest release];
[super viewDidLoad];
}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{    
return 1;// as of now i have taken one.
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
[self.listOfExpenses count]; 
} 
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  //labels are created and added to the cell's subview.

NSManagedObject *records = nil;
records = [self.listOfExpenses objectAtIndex:indexPath.row];
self.firstLabel.text = [records valueForKey:@"category"];
NSString *dateString = [NSString stringWithFormat:@"%@",[records valueForKey:@"date"]];
NSString *dateWithInitialFormat = dateString;
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"];
NSDate *date = [dateFormatter dateFromString:dateWithInitialFormat];
[dateFormatter setDateFormat:@"dd-MM-yyyy"];
NSString *dateWithNewFormat = [dateFormatter stringFromDate:date];
self.secondLabel.text = dateWithNewFormat;
NSString *amountString = [NSString stringWithFormat:@"%@",[records valueForKey:@"amount"]];
self.thirdLabel.text = amountString;
totalAmount = totalAmount + [amountString doubleValue];
}

2 个答案:

答案 0 :(得分:0)

您可以使用NSSortDescriptor

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    ...
    NSSortDescriptor * sort = [[NSSortDescriptor alloc] initWithKey:sortingKey ascending:ascending];
    NSArray * sortDescriptors = [NSArray arrayWithObject: sort];
    [request setSortDescriptors:sortDescriptors];

作为sortingKey,您将传递您的案例date

请在此处查看NSSortDecsriptor上的文档: https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSSortDescriptor_Class/Reference/Reference.html

答案 1 :(得分:0)

节标题中的日期有点棘手,但Apple的示例代码非常好,我正在成功使用我当前的一个应用程序。看看DateSectionTitles

简而言之,您需要使用NSFetchedResultsController并使用您实体的单独属性定义sectionNameKeyPath(日期本身不会这样做,因为它对第二个属性是准确的)。在numberOfSections中,您必须返回控制器为您提供的结果,而不是上面1numberOfRowsInSection也必须进行调整,你明白了。

Apple计算primitive date并在必须格式化节标题的字符串时重新构建它。一切都很直接。只需按照示例代码,您就可以立即解决此问题。