Я не горжусь этим, но это текущий дизайн нашей программы.
У меня есть объект фильтра, который выглядит примерно так:
#import "Filter.h"
@implementation Filter
@synthesize DataSet = _dataSet;
@synthesize FilterList = _filterList;
@synthesize TypeOfFilter = _typeOfFilter;
@synthesize isFilterOn;
- (id)initWithDataSet:(NSArray *)array {
self = [super init];
if (self) {
if ([array count] > 0) {
self.DataSet = array;
[self CreateFilterList];
}
}
return self;
}
- (void)CreateFilterList {
NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithCapacity:[_dataSet count]];
for (NSString *str in _dataSet) {
if (![str isEqualToString:@"NULL"]) {
[dict setObject:[NSNumber numberWithBool:NO] forKey:str];
}
}
self.FilterList = dict;
[dict release];
}
- (BOOL)isFilterOn {
NSArray *filters = [_filterList allKeysForObject:[NSNumber numberWithBool:YES]];
if ([filters count] > 0) {
return YES;
}
else {
return NO;
}
}
- (NSArray *)GetCurrentFilters {
return [_filterList allKeysForObject:[NSNumber numberWithBool:YES]];
}
- (void)ResetFilter {
for (NSString *key in [_filterList allKeys]) {
[_filterList setObject:[NSNumber numberWithBool:NO] forKey:key];
}
}
@end
Итак, в нашей модели мы в основном создаем TypeOfFilter для чего-то, что мы хотим фильтровать. Например, мы можем создать фильтр @ "Name" для фильтрации по имени в нашей базе данных. Все объекты Filter являются членами нашего модельного класса. Я действительно не знал другого способа сделать это в то время, и я смотрю, как провести рефакторинг на будущее. По сути, мой фильтр - это просто словарь, значение которого YES для элементов, по которым мы хотим отфильтровать.
В нашем MainViewController мы предоставляем пользователю возможность фильтровать разные вещи, такие как Name, во всплывающем окне. Когда выбор сделан, объект Filter обновляется примерно так:
[((Filter *)[modelClass.FilterDictionary objectForKey:@"NameFilter"]).FilterList setObject:[NSNumber numberWithBool:YES] forKey:key];
В нашем modelClass есть словарь объектов Filter. Таким образом, основываясь на выборе пользователя, мы получаем соответствующий объект Filter по имени и устанавливаем YES или NO на основании их выбора.
Также, когда в поповере делается выбор, который предоставляет пользователю опции для фильтрации, выполняется действие с методом DoFilter, который в основном перерисовывает содержимое MainViewController с соответствующими элементами.
Я лично ненавижу этот дизайн, и мне было интересно, как можно улучшить его. Спасибо.