我正在尝试创建一个过滤器。我有一个函数返回NSArray我可以拥有的不同类别。我想为“全部”添加一个额外选项,表示没有应用过滤器。例如,应显示:
All
Soda
Wine
Beer
我从这开始,但我认为这根本不是很好的实现,而且也不正确。这就是我到目前为止所处的位置:
- (void)initCategoryDictionary {
NSMutableArray *conditionCategories = (NSMutableArray *)[self GetAllCategories];
[conditionCategories insertObject:@"All" atIndex:0]; // no filter case at first index
NSMutableArray *objectValues = [NSMutableArray array];
[objectValues addObject:[NSNumber numberWithBool:YES]]; // this is for the no filter case at the first index
for (int i = 0; i < [conditionCategories count]; i++) {
[objectValues addObject:[NSNumber numberWithBool:NO]];
}
self.CategoryDictionary = [NSMutableDictionary dictionaryWithObjects:objectValues forKeys:conditionCategories];
}
在方法的第一行,我不知道是否应该对此进行类型转换。我的类别目前没有“全部”类别,所以这是我可以想到在将NSArray插入字典之前将其添加到NSArray的方式。
我想我可以添加一个YES,NO,NO,......数组(对于字典中的所有其他项都是NO)。这样,我的字典将默认为All为true(未应用过滤器)。然后根据选择的内容,我将All改为NO,其他值选择为YES并适当过滤。 (for循环是错误的,因为它只给了我一个包含0和1作为我的值的2个对象的数组。
所以这就是我认为我会做的,但显然这不是一个好的或正确的做事方式。有什么想法吗?谢谢!
答案 0 :(得分:0)
如果要应用All
,为什么不将它作为单独的布尔值,将其作为过滤器的一部分进行检查,并且不要担心它在数组本身中?
答案 1 :(得分:0)
您可以做的一件事是将类别名称映射到NSPredicate
的实例。每个谓词本身都会执行过滤器(虽然我不清楚被过滤的是什么)。因此,您可以按如下方式设置字典:
- (void)initCategoryDictionary {
NSMutableArray *conditionCategories = (NSMutableArray *)[self GetAllCategories];
[conditionCategories insertObject:@"All" atIndex:0]; // no filter case at first index
NSMutableArray *objectValues = [NSMutableArray array];
[objectValues addObject:[NSPredicate predicateWithFormat:@"TRUEPREDICATE"]; // this is for the no filter case at the first index
for (NSString *category in conditionCategories) {
[objectValues addObject:[NSPredicate predicateWithFormat:@"category == %@", category]];
}
self.CategoryDictionary = [NSMutableDictionary dictionaryWithObjects:objectValues forKeys:conditionCategories];
}
TRUEPREDICATE
将始终返回true,因此匹配任何内容。您必须编辑其他谓词以处理您正在过滤的任何内容。
答案 2 :(得分:0)
你真的很难做到这一点。您尝试为字典初始化设置一个数组和值,这是可能的,但对于您正在做的事情来说真的很难。我只想创建一个NSMutableDictionary,添加键的值。
-(void) initCategoryDictionary {
NSMutableDictionary *dict = [[[NSMutableDictionary alloc] initWithValue:[NSNumber numberWithBool:YES]] autorelease];
NSArray *conditionCategories = [self GetAllCategories]; //No you dont need to type cast this as long as it returns the same type (NSArray here)
for(NSString *str in conditionCategories) {
[dict addValue:[NSNumber numberWithBool:NO] forKey:str];
}
[self setCategoryDictionary:dict];
}