0

コア データ スタックに 2 種類のイベントが保存されており、それぞれにタイムスタンプがあります。各セクションが任意の長さ (1 日、1 週間など)UITableViewであるwith セクションでこれらのレコードを表示する良い方法があるかどうかに興味があります。

コア データ オブジェクトのタイムスタンプを、1 日の時間を切り捨ててセクション タイトルに変換する方法はありますか?

したがって、次のようになります。

    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
...

この目標を達成するために私が現在使用しているものは次のとおりですが、各セクションが 1 日という制限があります。

しかし、私はこの要件について考えたことがなく、タイムスタンプだけのイベントのリストを持っているとしましょう。それらをセクションに分割するにはどうすればよいですか?

//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

最良の方法は、マネージド オブジェクト モデルに一時プロパティを追加することです。そのプロパティのアクセサで、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 に答える
1

表示目的のためだけに (冗長な) データを追加するのは、常に最後の手段です。

少し似たようなケースでは、CoreData オブジェクトにカテゴリを追加するだけです。

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

次に、これを として使用するsectionNameKeyPathだけで、他のすべては通常の状況と同じです。

あなたの場合、このカテゴリはもう少し複雑になりますが、一般的な概要は同じです。また、セクション名が揮発性であるという事実にも留意する必要があります。

トリッキーな (/醜い) 部分は、現在のセクショニング設定をカテゴリに伝えることです。一部のグローバルまたは静的変数は、効率的にジョブを実行できます。

于 2012-10-17T01:27:31.977 に答える
0

すっぴん!私のアドバイスは、 NSDateFormatter を使用することです

これは Apple ドキュメントへのリンクです: NSDateFormatter

timeStamp がある 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 に答える