Сегментированный контроллер (множественный выбор) с базовыми данными - PullRequest
1 голос
/ 12 января 2010

У меня есть приложение на основе Core Data, которое построено вокруг одного основного объекта. Есть несколько других сущностей, которые связаны с ним, одна из которых является сущностью, называемой «Примечания».

Этот объект Notes имеет дату (NSDate), описание (NSString) и еще один атрибут. Этот атрибут должен иметь 4 возможных варианта, из которых у каждого объекта будет как минимум 1 и, возможно, все 4.

Я думал, что при создании заметки может существовать сегментированный контроллер с 4 возможными вариантами. (Можно ли здесь выбрать несколько кнопок?)

Я также хочу отсортировать все эти заметки по этой опции. То есть для создания запроса на выборку, который возвращает, например, только примечания, для которых выбран вариант 3. (Даже если у них также был выбран вариант 2 или даже все 4 варианта.)

Есть предложения о том, как лучше всего это реализовать?

Спасибо.

Ответы [ 3 ]

1 голос
/ 12 января 2010

Чтобы использовать маски для хранения нескольких выборов, вы можете сделать что-то вроде следующего:

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 будет уникальным для некоторой комбинации четырех опций. Вы можете вернуться от этой комбинированной маски к отдельным маскам, чтобы выбрать разные кнопки сегментированного элемента управления, например ::10000

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, как описано выше.

0 голосов
/ 12 января 2010

Используйте перечисление для определения четырех опций, например ::100100

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

Они будут пронумерованы от 0 до 5.

Базовые данные хранят целые числа как NSNumber экземпляров. Возможно, вы могли бы сохранить в своей сущности Note атрибут, который называется optionType, который хранит NSNumber эквивалент значения NoteOptionType.

Вы можете преобразовать их в NSNumber параметры, например, [NSNumber numberWithInt:kNoteOptionTypeOne].

Вы можете написать вспомогательный метод для преобразования NoteOptionType в строку для помещения в 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];
0 голосов
/ 12 января 2010

Во-первых, вместо того, чтобы пытаться использовать один атрибут для сбора четырех возможных вариантов, я бы использовал четыре отдельных логических атрибута. Это также позволит вам легко фильтровать ваши запросы на получение.

Для настройки каждого логического значения я использовал бы UIButton или UISwitch. UISegmentedControl не поддерживает множественный выбор.

...