iOS过滤数组

时间:2012-12-04 00:28:40

标签: ios uitableview filter nsarray nspredicate

我有一个显示在表格中的数据数组。该数组有多个字段,包括我想要过滤的两个特定字段,“呼叫类型”和“县”。 “呼叫类型”的值是“f”或“e”,县的值是“w”或“c”。我希望有4个UISwitch来打开/关闭“w”,打开/关闭“c”等。很难解释但如果你去这个网站看看右上角,它究竟是什么我想要做。 http://www.wccca.com/PITS/在4个过滤器中,两个过滤器控制县字段,两个过滤器控制呼叫类型字段。但它们都是独立运作的。我将如何实现这一目标?我会在每次过滤某些内容时使用NSPredicate创建一个新数组吗?谢谢。

1 个答案:

答案 0 :(得分:0)

你绝对可以使用NSPredicate。可能最简单的方法是对所有四个开关使用相同的IBAction并让它重新计算:

- (IBAction)anySwitchDidChange:(id)sender
{
    // make a set of all acceptable call types
    NSMutableSet *acceptableCallTypes = [NSMutableSet set];
    if(self.fSwitch.on) [acceptableCallTypes addObject:@"f"];

    // ... etc, to create acceptableCallTypes and acceptableCounties

    NSPredicate *predicate = 
        [NSPredicate predicateWithFormat:
                            @"(%@ contains callType) and (%@ contains county)", 
                            acceptableCallTypes, acceptableCounties];

    /*
       this predicate assumes your objects have the properties 'callType' and 
       'county', and that you've filled the relevant sets with objects that would
       match those properties via isEqual:, whether strings or numbers or
       anything else.

       NSDictionaries are acceptable since the internal mechanism used here is
       key-value coding.
    */

    NSArray *filteredArray = [_sourceArray filteredArrayUsingPredicate:predicate];

    // send filteredArray to wherever it needs to go
}

使用predicateWithFormat:会导致文本在那里被解析。在这种情况下,这应该没有任何问题,但一般情况下,您可以提前创建谓词,并在相关时刻仅提供参数,如果您最终在真正时间关键区域使用一个参数。