1

我正在构建一个应用程序,用户可以在其中根据 4 个参数过滤一组照片:

模型 http://seismicdevelopment.com/shot.png

FeedType 和 PhotoType 可以分别是三个可能的值之一。Market 和 Tag 可以包含描述照片的多个值。我有 UI 设置,其中 FeedType/PhotoType 是每个参数的一系列 UISwitches。如果您打开一个值,该组中的其他值将关闭。

市场/标签具有可以选择/正常的 UIButtons。任何选定的按钮都应添加到过滤中以缩小结果范围。

我似乎无法弄清楚我应该如何编写最有效的过滤逻辑。基本上在任何控制更改上,我都需要重写谓词过滤器,但我似乎无法理解如何将单独的参数过滤器链接在一起。

对于标签/市场,我还想为没有记录的 UIButtons 添加禁用状态,或者基于当前选择的按钮没有记录。

4

1 回答 1

2

在不知道参数类型的情况下很难说出精确的建议,但是,据我所知,您需要有四个变量,更有可能是 NSStrings,并且每次用户更改参数时,您都会创建一个新的通过以正确的格式附加所有变量来获取谓词。这就是我一般的看法。

更新

因此,使用 Market 和 Tag 按钮,一切都非常明显 - 你应该使用NSCompondPredicate. 您将需要一组谓词,因此请创建一个属性。

@property (strong) NSMutableArray *subpredicates;

然后,每次用户触摸按钮时,您都会添加或删除该缩小谓词。

- (void)tagButtonTouched:(UIButton *)button
{
    if (thisTagIsNotYetSelected)
        [subpredicates addObject:[NSPredicate predicateWithFormat:@"ANY tags.name == %@", button.titleLabel.text]];//or some other predicate based on that button title
    else
        [subpredicates removeObject:[NSPredicate predicateWithFormat:@"ANY tags.name == %@",button.titleLabel.text] ]];
}

同样的事情Markets

 - (void)marketButtonTouched:(UIButton *)button
 {
     if (thisMarketIsNotYetSelected)
         [subpredicates addObject:[NSPredicate predicateWithFormat:@"ANY markets.name == %@", button.titleLabel.text]];//or some other predicate based on that button title
     else
         [subpredicates removeObject:[NSPredicate predicateWithFormat:@"ANY markets.name == %@",button.titleLabel.text] ]];
 }

您还应该添加两个变量,我猜,NSPredicates或者NSString,它们将保存选定的值FeedType,让PhotoType我们分别调用它们。当用户触摸这些开关时(为什么不使用分段控件?),您只需更改它们的值。feedTypePredicatephotoTypePredicate

最后,您应该将所有这些谓词组合成一个并进行获取!

if(photoTypePredicate)
    [subpredicates addObject:photoTypePredicate];
if(feedTypePredicate)
    [subpredicates addObject:feedTypePredicate];
NSPredicate *finished = [NSCompoundPredicate andPredicateWithSubpredicates:subpredicates];//Your final predicate
于 2012-04-21T11:10:29.407 回答