在核心数据中使用日期属性在表视图控制器中创建节标题

时间:2013-10-17 07:01:10

标签: ios core-data tableview sections

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

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

我还在学习,所以我真的不知道怎么做到这一点。我已经有一个数组(称为事务),它负责当前在表视图中显示所有内容。

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

我将如何实现这些方法:

sectionIndexTitlesForTableView

tableView:titleForHeaderInSection

我之前没有完成任何部分的实施,它让我失望了。

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

非常感谢任何帮助!

P.S。我目前没有使用NSFetchedResultsController;我知道这更容易,但我想先这样学习..

2 个答案:

答案 0 :(得分:3)

我知道回答已经太晚了。还是想在这里发表我的意见。

当我们使用核心数据存储数据和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
}

这将得到如下结果:

enter image description here

希望这会对你有帮助!!!

<强>更新
这是getTimeStrWithDayPrecision()日期扩展方法的示例实现:

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

答案 1 :(得分:0)

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

我在这里发布一些示例代码来分组场合。 在头文件中声明字典对象,例如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中使用以下代码。

-(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<arr.count)return [arr objectAtIndex:section];
    return nil;
}

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

NSString *dateOfOccasion = [self getSalesOrderKey:section];

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