Правильный способ создать фильтр для iPhone? - PullRequest
2 голосов
/ 10 февраля 2012

Я не горжусь этим, но это текущий дизайн нашей программы.

У меня есть объект фильтра, который выглядит примерно так:

#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 с соответствующими элементами.

Я лично ненавижу этот дизайн, и мне было интересно, как можно улучшить его. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...