使用Core Data中的日期属性在表视图控制器中创建节标题

我目前有一个实质性工作的应用程序,我目前正在经历一个增强这个的学习过程。 我有一个TableViewController,当出现提示时,要求用户输入一些信息,当用户单击“保存”时,该信息会在表格视图中正确显示。

我想要求用户添加一点信息,这将构成该部分。 这将是日期。 想想Instragram; 在每张图片之前,你有一个日期等等。我想实现类似的东西,其中输入的日期构成节标题,然后按时间顺序显示它们。

我还在学习,所以我真的不知道如何实现这一目标。 我已经有一个数组(称为事务),它负责当前在表视图中显示所有内容。

我是否需要创建另一个数组来保存输入的日期?

我将如何实现这些方法:

sectionIndexTitlesForTableView tableView:titleForHeaderInSection 

我以前没有做任何部分的实施,它让我失望。

交易实体与其他几个实体有关系,偶尔就是其中之一。 在TableCell中,我成功地显示了transaction.occasion的结果,该结果调用了Occasion实体并显示了它的名称等。该Occasion实体也有一个dateOfEvent属性,基本上,我希望节标题显示dateOfEvents与表示该日期事件的相应行。

任何帮助将非常感激!

ps我目前没有使用NSFetchedResultsController; 我知道这更容易,但我想先学习这种方式..

我知道现在回答为时已晚。 还是想到在这里发表我的意见。

当我们使用核心数据存储数据和tableview来呈现它时,使用NSFetchedResultsController总是有用且节省时间。

这是一个简单的场景,如whatsapp,它将每天对所有消息进行分组并对每个组中的消息进行排序:

数据模型:

 Message<<------->Conversation Message{ @NSManaged var body: String? @NSManaged var seen: NSNumber? @NSManaged var time: NSDate? @NSManaged var uid: String? @NSManaged var conversation: Conversation? var sectionTitle: String? { //this is **transient** property //to set it as transient, check mark the box with same name in data model return time!.getTimeStrWithDayPrecision() } } 

NSFetchedResultsController初始化为:

  let request = NSFetchRequest(entityName: "Message") let sortDiscriptor = NSSortDescriptor(key: "time", ascending: true) request.sortDescriptors = [sortDiscriptor] let pred = NSPredicate(format: "conversation.contact.uid == %@", _conversation!.contact!.uid!) request.predicate = pred let mainThreadMOC = DatabaseInterface.sharedInstance.mainThreadManagedObjectContext() fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: mainThreadMOC, sectionNameKeyPath: "sectionTitle", cacheName: nil) fetchedResultsController.delegate = self do { try fetchedResultsController.performFetch() } catch { fatalError("Failed to initialize FetchedResultsController: \(error)") } 

表视图的数据源将是:

 //MARK: Table view data source func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { let sectionInfo = fetchedResultsController.sections![section] let n = sectionInfo.numberOfObjects return n } func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { return 60 } func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { let sectionInfo = fetchedResultsController!.sections! as [NSFetchedResultsSectionInfo] return sectionInfo[section].name } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let message = fetchedResultsController.objectAtIndexPath(indexPath) as! Message let cell = tableView.dequeueReusableCellWithIdentifier(IncomingChatBubbleCell.identifier(), forIndexPath: indexPath) as! IncomingChatBubbleCell configureCell(cell, indexPath: indexPath) return cell } 

这将得到如下结果:

在此处输入图像描述

希望对你有帮助!!!


更新
这是getTimeStrWithDayPrecision() Date扩展方法的示例实现:

 func getTimeStrWithDayPrecision() -> String { let formatter = NSDateFormatter() formatter.timeStyle = .NoStyle formatter.dateStyle = .ShortStyle formatter.doesRelativeDateFormatting = true return formatter.stringFromDate(self) } 

我不关心您是使用核心数据还是其他任何数据源。我的结论是您需要根据日期对场合进行分组。为此,您必须根据dateOfOccasion属性过滤数据源(此处为numberOfOccasions)的场合。

我在这里发布一些示例代码来分组场合。 在头文件中声明字典对象,例如dicOccasions。

 for(int i=0;i< numberOfOccasions;i++) { if(dicOccasions==nil)dicOccasions = [[NSMutableDictionary alloc] init]; NSString *key = [NSString stringWithFormat:@"%@",dateOfOccasion]; NSMutableArray *ArrTemp= (NSMutableArray*)[[dicOccasions objectForKey:key] mutableCopy]; if(ArrTemp==nil)ArrTemp = [[NSMutableArray alloc] init]; [ArrTemp addObject:[[numberOfOccasions objectAtIndex:i] copy]]; [dicOccasions setObject:[ArrTemp mutableCopy] forKey:key]; } 

在tableview numberOfsections委托你可以使用dicOccasions的计数在tableView numberOfRowsInSection中使用follwing代码。

 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { NSString *key = [self getSalesOrderKey:section]; NSMutableArray * Arry = [dicOccasions objectForKey:key]; if([Arry isKindOfClass:[NSString class]])return 0; return [Arry count]; } -(NSString*)getSalesOrderKey:(int)section { NSArray *arr = [dicOccasions allKeys]; arr = [arr sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)]; if (section 

在tableview的viewForHeaderInSecion委托中,您可以使用以下代码来获取dateOfOccasion

 NSString *dateOfOccasion = [self getSalesOrderKey:section]; 

您可以在标签中显示它并显示为节标题。