1

我有一个基于核心数据的应用程序,它是围绕一个主要实体构建的。还有其他几个与之相连的实体,其中之一是一个名为“Notes”的实体。

此 Notes 实体具有日期 (NSDate)、说明 (NSString) 和一个其他属性。该属性将有 4 个可能的选项,其中每个实体至少有 1 个,可能全部有 4 个。

我在想,当创建注释时,可能会有一个带有 4 个可能选项的分段控制器。(这里甚至可以选择多个按钮吗?)

我还希望能够通过此选项对所有这些笔记进行排序。也就是说,例如,创建一个仅返回选择了选项 3 的 Notes 的获取请求。(即使他们也选择了选项 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值对于四个选项的某些组合是唯一的。您可以从这个组合掩码返回到单个掩码,以便选择分段控件的不同按钮,例如:

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

首先,我不会尝试使用一个属性来收集四个可能的选项,而是使用四个单独的布尔属性。这也将允许您非常轻松地过滤您的获取请求。

要配置每个布尔值,我会使用 UIButton 或 UISwitch。UISegmentedControl 不支持多选。

于 2010-01-12T10:48:31.417 回答
0

使用枚举定义四个选项,例如:

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

这些将被编号为 0 到 5。

Core Data 将整数存储为NSNumber实例。您也许可以在您的Note实体中保留一个名为的属性,该属性optionType存储值的NSNumber等价物NoteOptionType

您可以NSNumber通过类似的方式将这些转换为选项,例如[NSNumber numberWithInt:kNoteOptionTypeOne].

您可以编写一个方便的方法来将 a 转换为NoteOptionType要放入 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]);

在您的 fetch 中,您可以使用NSNumber放入 Core Data 存储中的值作为排序标准,通过使用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 回答