1

1 つのメイン エンティティを中心に構築された Core Data ベースのアプリケーションがあります。それに接続されている他のいくつかのエンティティがあり、そのうちの1つは「メモ」と呼ばれるエンティティです。

この Notes エンティティには、日付 (NSDate)、説明 (NSString)、およびその他の 1 つの属性があります。この属性には 4 つの可能なオプションがあり、各エンティティには少なくとも 1 つ、場合によっては 4 つすべてがあります。

メモが作成されているときに、4 つの可能なオプションを持つセグメント化されたコントローラーが存在する可能性があると考えていました。(ここで複数のボタンを選択することさえ可能ですか?)

さらに、このオプションでこれらすべてのメモを並べ替えられるようにしたいと考えています。つまり、たとえば、オプション 3 が選択されたメモのみを返すフェッチ リクエストを作成します。(オプション 2 を選択した場合でも、4 つのオプションすべてを選択した場合でも。)

これを実装する最良の方法について何か提案はありますか?

ありがとう。

4

3 に答える 3

1

複数の選択を保存するためにマスクを使用するには、次のようにします。

NSInteger const kNoteOptionTypeOne = 0x1;   // 0000 0001
NSInteger const kNoteOptionTypeTwo = 0x2;   // 0000 0010
NSInteger const kNoteOptionTypeThree = 0x4; // 0000 0100
NSInteger const kNoteOptionTypeFour = 0x8;  // 0000 1000

NSNumber複数選択の場合、結合したマスクを として保存します。

NSInteger mySelectionsMask = (kNoteOptionTypeOne | kNoteOptionTypeFour); // 0x0 | 0x4 = 1001 = 9
NSNumber *mySelections = [NSNumber numberWithInt:mySelectionsMask];

このmySelections値は、4 つのオプションの組み合わせに固有のものです。セグメント化されたコントロールの別のボタンを選択するために、この結合されたマスクから個々のマスクに戻ることができます。

if ([mySelections intValue] == (kNoteOptionTypeOne | kNoteOptionTypeFour)) {
    // select buttons one and four of the segmented control
}
else if some other combination { etc. }

または:

if (([mySelections intValue] & kNoteOptionTypeOne) == kNoteOptionTypeOne) 
    // select button one
if (([mySelections intValue] & kNoteOptionTypeTwo) == kNoteOptionTypeTwo)
    // select button two
... 

これは として保存されるため、上記のようNSNumberにインスタンスで並べ替えることができます。NSSortDescriptor

于 2010-01-12T11:13:34.457 に答える
0

まず、1 つの属性を使用して 4 つの可能なオプションを収集しようとする代わりに、4 つの個別のブール属性を使用します。これにより、フェッチ リクエストを非常に簡単にフィルタリングすることもできます。

各ブール値を構成するには、UIButton または UISwitch を使用します。UISegmentedControl は複数選択をサポートしていません。

于 2010-01-12T10:48:31.417 に答える
0

列挙を使用して、次の 4 つのオプションを定義します。

typedef enum _NoteOptionType {
    kNoteOptionTypeOne,
    kNoteOptionTypeTwo,
    kNoteOptionTypeThree,
    kNoteOptionTypeFour,
    kNoteOptionTypes,
} NoteOptionType;

これらには 0 ~ 5 の番号が付けられます。

Core Data は整数をNSNumberインスタンスとして格納します。おそらく、値に相当する値を格納するNoteと呼ばれるエンティティに属性を保持できます。optionTypeNSNumberNoteOptionType

NSNumberこれらは、たとえば のような方法でオプションに変換できます[NSNumber numberWithInt:kNoteOptionTypeOne]

NoteOptionTypea を文字列に変換して a に入れる便利なメソッドを書くことができますUISegmentedControl

+ (NSString *) keyForNoteOptionTypeTag:(NoteOptionType)optionTypeTag {
    if (optionTypeTag == kNoteOptionTypeOne)
        return [NSString stringWithFormat:@"First"];     
    else if (optionTypeTag == kNoteOptionTypeTwo)
        return [NSString stringWithFormat:@"Second"];
    ...
    return [NSString stringWithFormat:@"Undefined"];
}

次のように参照します。

NSLog(@"second option is: %@", [Note keyForNoteOptionTypeTag:kNoteOptionTypeTwo]);

フェッチでは、次のように、を使用NSNumberして、コア データ ストアに格納した値を並べ替えの基準として使用できますNSSortDescriptor

NSSortDescriptor *optionTypeDescriptor = [[NSSortDescriptor alloc] initWithKey:@"optionType" ascending:YES selector:nil];
NSArray *sortDescriptors = [NSArray arrayWithObjects:optionTypeDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[optionTypeDescriptor release];
于 2010-01-12T10:51:44.297 に答える