0

我的核心数据堆栈中存储了两种类型的事件,每一种都有一个时间戳。我很感兴趣是否有一种在UITableViewwith 部分中显示这些记录的好方法,其中每个部分都是任意长的(一天、一周等)

有没有办法将核心数据对象的时间戳转换为部分标题,将一天中的小时数四舍五入?

所以我们会得到:

    October 5 < section title
    Record 1 < records displayed in the section
    Record 2
    Record 3

    October 6
    Record 4

    October 7 
    Record 5
    ...


-OR-
Week 1
Record 1
Record 2

Week 2
Record 3
...

这是我目前用来实现这一目标的方法,但仅限于每天的每个部分。

但是可以说我没有考虑过这个要求,并且有一个只有时间戳的事件列表。我怎样才能把它们分成几部分?

//the method used to convert a date into a number to store with the event
    -(int)getDateIDFromDate:(NSDate*)date
    {
        int gmtOffset =    [[NSTimeZone localTimeZone] secondsFromGMT];
        int dateID =([date timeIntervalSinceReferenceDate]+gmtOffset)/86400;
        return dateID;
    }


    //when inserting  a record, the number is saved
    newManagedObject.dayID = [NSNumber numberWithInt:[self getDateIDFromDate:date]];


    //when retrieving, the number is used as a section key path
     NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"dayID" cacheName:@"Day"];


//the number gets converted back into the date.
    - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
        // Display the authors' names as section headings.
        //    return [[[dataManager.dreamEventsController sections] objectAtIndex:section] name];

        NSString* dayIndex =  [[[dataManager.fetchedResultsController sections] objectAtIndex:section] name];
        int dayFromReferenceDate = dayIndex.intValue;
        return [dataManager.sectionDateFormatter stringFromDate:[NSDate dateWithTimeIntervalSinceReferenceDate:(dayFromReferenceDate+1)*86400]];



    }
4

3 回答 3

1

仅出于显示目的添加(冗余)数据应始终是最后的手段。

在稍微类似的情况下,我只是向 CoreData 对象添加一个类别,例如

-(NSString*)firstLetter
{
    NSString *title = self.title;
    if ( [title length] == 0 ) return @"?";
    return [title substringToIndex:1];
}

然后我只是将其用作 thesectionNameKeyPath并且所有其他都与正常情况下相同。

在你的情况下,这个类别会更详细一点,但总体大纲可能是相同的。并且部分名称将是易变的这一事实也应牢记在心。

一个棘手(/丑陋)的部分是将当前的切片设置传达给类别。一些全局或静态变量可以有效地完成这项工作。

于 2012-10-17T01:27:31.977 回答
1

最好的方法是将瞬态属性添加到您的托管对象模型中。在该属性的访问器中,返回一个NSDate带有截断时间的标准化(您可以使用 来执行此操作NSDateComponents)。然后,当需要获取这些对象时,将其设置.. sectionNameKeyPath:为该瞬态属性。

更新:假设您的 NSManagedObject 子类有一个瞬态属性monthOfTheYear

- (NSNumber*)monthOfTheYear
{
    [self willAccessValueForKey:@"monthOfTheYear"];

    NSDateComponent *dateComponent = [cachedCalendar components:NSMonthCalendarUnit fromDate:self.timestamp]; // cachedCalendar is a NSCalendar instance

    [self didAccessValueForKey:@"monthOfTheYear"];
    return [NSNumber numberWithInteger:dateComponent.month]; // or a normalized number that takes consideration of the year too
}

我们不会直接创建 NSString 瞬态属性,因为这会打乱您的排序(并且您会失去多语言支持)。和willAccessValueForKey:didAccessValueForKey:重要。你应该阅读更多关于他们的文档。

然后是时候显示部分标题:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    NSInteger monthNumber = // Get the monthOfTheYear value from the first NSManagedObject in this section.
    return [[cachedDateFormatter monthSymbols] objectAtIndex:(monthNumber-1)]; // cachedDateFormatter is a NSDateFormatter instance

}
于 2012-10-17T01:41:22.787 回答
0

顶哥!我的建议是使用 NSDateFormatter

这是 Apple 文档的链接:NSDateFormatter

我会在你有时间戳的 managedObject 上添加一个类别,

@interface MyManagedobject (ReadableTimestamp)
     -(NSString *)formatedStringFromTimestamp;
@end 

@implementation MyManagedobject (ReadableTimestamp)
     -(NSString *)formatedStringFromTimestamp{
        //TODO: Here you apply all your fancy format, I'm just using the default
        NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
        [formatter setFormatterBehavior:NSDateFormatterBehavior10_4];
        [formatter setDateStyle:dateStyle];
        [formatter setTimeStyle:timeStyle];
         NSString *result = [formatter stringForObjectValue:self.timestamp];
        return result;
     }

 @end

我希望这会有所帮助,美好时光。

如果你是某种优化狂(像我自己),你可以将你的 timeFormatter 定义为一个静态的,这样你就不需要每次都构建它。

于 2012-10-17T02:02:48.540 回答