3

現在、オブジェクトの配列を日順にソートして、正しい順序、つまり月曜日、火曜日、水曜日、開始時間でグループ化できるようにしようとしています。

唯一の問題は、これを行う方法がわからないことです。現在、私のコードは次のようになっています。

NSString *sectionKey = nil;
switch (tab) {

case kByWeekA: {
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"day" ascending:NO];
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"starttime" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1, sortDescriptor2, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptor1 release];
[sortDescriptor2 release];
[sortDescriptors release];
sectionKey = @"day";
break;
}
case kByWeekB:{
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"day" ascending:YES];
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"starttime" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1, sortDescriptor2, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptor1 release];
[sortDescriptor2 release];
[sortDescriptors release];
sectionKey = @"day";
break;
}
default:
break;
}

助けてください!

4

2 に答える 2

13

2 つの解決策があります。

  1. 「日」キーを見て、必要に応じて並べ替えるソート記述子のカスタム比較を作成します。ここでカスタム比較の指定を参照してください。
  2. 「日」キーを整数にして、目的の順序で日の値の列挙を使用します。

UPDATE 2オプション 2 のコード例:

- "day" 属性を数値 (Int16) に変更し、一時的な (非永続的な) "dayName" 文字列属性を追加します。

-次の曜日の列挙を追加します。

typdef enum {
    kMonday,
    kTuesday,
    kWednesday,
    kThursday,
    kFriday,
    kSaturday,
    kSunday
} WeekDay;

-管理対象オブジェクトの「日」プロパティを NSNumber オブジェクトに設定します。例えば:

object.day = [NSNumber numberWithInteger:kMonday];

-一時的な「dayName」プロパティの getter 関数を実装します。

- (NSString*)dayName {
    switch ((WeekDay)self.day.integerValue) {
        case kMonday:
            return @"Monday";
            break;
        case kTuesday:
            return @"Tuesday";
            break;
        case kWednesday:
            return @"Wednesday";
            break;
        case kMonday:
            return @"Monday";
            break;
        case kThursday:
            return @"Thursday";
            break;
        case kFriday:
            return @"Friday";
            break;
        case kSaturday:
            return @"Saturday";
            break;
        case kSunday:
            return @"Sunday";
            break;
    }
}

- フェッチ リクエストでは、「日」でソートし、セクション名のキー パスとして「dayName」を使用します。

更新
注: オプション 1 は配列の並べ替えには正常に機能しますが、Core Data は「サポートされていない NSSortDescriptor セレクター: weekdayCompare:」に対して「NSInvalidArgumentException」例外をスローしています。

オプション 1 のコード例:

// category on NSString for custom comparison
@interface NSString (WeekdayComparison)
- (NSComparisonResult)weekdayCompare:(NSString*)otherDay;
@end
@implementation NSString (WeekdayComparison)
- (NSComparisonResult)weekdayCompare:(NSString*)otherDay {
    NSArray *weekDays = [NSArray arrayWithObjects:@"Sunday", @"Monday", @"Tuesday", @"Wednesday", @"Thursday", @"Friday", @"Saturday", nil];

    NSUInteger selfIndex = [weekDays indexOfObject:self];
    NSUInteger otherDayIndex = [weekDays indexOfObject:otherDay];

    if (selfIndex < otherDayIndex) {
        return NSOrderedAscending;
    }
    else if (selfIndex > otherDayIndex) {
        return NSOrderedDescending;
    } else {
        return NSOrderedSame;
    }
}
@end

新しい比較方法を使用するには:

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"day" ascending:YES selector:@selector(weekdayCompare:)];
NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
[sortDescriptor release];
于 2010-01-30T20:33:43.283 に答える
0

私はセクションのカスタムソートと同じ要件で作業していましたが、ソリューション#1は非常にうまく機能しました。ありがとう!

追加したいことの 1 つは、一時的なプロパティを追加した後、読み込みの数秒後にアプリが不可解にクラッシュした場合は、データベースをリセットする必要があるということです。

NSError *error;
NSURL *applicationDocumentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
NSURL *databaseURL = [applicationDocumentsDirectory URLByAppendingPathComponent:@"My Database Name"];
[[NSFileManager defaultManager] removeItemAtPath:databaseURL.path error:&error];

お役に立てれば!

于 2012-11-10T21:54:19.860 に答える