我正在构建应用程序并遇到了一些我无法解决的问题。它的要点是我有一个允许用户关闭/打开过滤器的视图。我目前将这些过滤器链接到名为Filter的NSObject。过滤器对象具有以下属性:
@property (nonatomic, strong) NSString *activity;
@property (nonatomic, strong) NSString *mileage;
@property (nonatomic, assign) BOOL pets;
@property (nonatomic, assign) BOOL accessibility;
@property (nonatomic, assign) BOOL fee;
以下是过滤视图的外观:
然后我有包含以下属性的Trail对象:
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSMutableArray *activities;
@property (nonatomic, strong) NSString *miles;
@property (nonatomic, assign) BOOL pets;
@property (nonatomic, assign) BOOL accessibility;
@property (nonatomic, assign) BOOL fee;
我遇到问题以某种方式创建动态if语句,以便在某些过滤器打开或不打开nil(比如活动,宠物,里程)时,for循环将遍历我的所有跟踪对象并比较它们的属性到选定的过滤器。如果Trail对象'过滤器(在此示例中为活动,宠物和里程)与过滤器对象不匹配,然后它们不会添加到新阵列中。所以我无法解决的问题是创建一个只包含已打开过滤器的if语句:
if( (selectedFilter1 == trailProperty1) && (selectedFilter2 == trailProperty2) etc...)
答案 0 :(得分:2)
最好是你有5个额外的布尔值,你有你的开关的状态,并有类似的东西
BOOL match = true;
if (filterOn1)
{
match &= (selectedFilter1 == trailProperty1);
}
if (filterOn2)
{
match &= (selectedFilter2 == trailProperty2);
}
...
我假设trailPropertyX
是迭代循环中当前项的值
答案 1 :(得分:1)
我认为问题出在您的Filter
对象上。我能想到你可以做的两件事:
再添加5个BOOL
以跟踪是否应该应用过滤器。编辑:有关详细信息,请参阅Merlevede的答案。
将Filter
的所有属性更改为NSString
,并将值设置为@"Deactivated"
或其他一些特殊字符串,以跟踪它不应该是用过的。然后,在for
循环中,检查给定值是否为"已取消激活"串。如果不是,请在Trail
对象上应用过滤器。
我无法真正看到选择一种方法而不是另一种方法的理由 - 实际上我认为我可能在我的项目中使用这两种方法,这取决于我在编写该部分时的心情。你可以随便挑选一套更舒服的东西。
答案 2 :(得分:1)
无法无法检查所有5个过滤器对象的属性开/关状态(由UISwitch
表示),因为在运行时你不会# 39;不知道用户是否已打开任何或所有属性。
答案 3 :(得分:1)
我和一个合作伙伴一起开展了一个项目,我们遇到了类似的问题:按照他们的名字,代码,状态,等级等搜索大学列表(你必须能够打开或关闭某些过滤器)所以有一个解决方案,你的动态 - 但它不是那么简单(或者至少我们的解决方案不是,我希望它不是最令人困惑的)
所以这是解决方案:您的预告片类可以有一系列标准(另一个类),每个标准都有选择的选项,即:允许携带宠物:是/否及其名称(PetFilter)之后您的预告片(其中)我猜你有一个NSMutableArray或类似的循环通过Criteria数组递归。根据用户是否选择使用过滤器来添加Critera。循环如何工作:如果过滤器不是nil,那么使用过滤器来比较所有预告片,如果预告片与从阵列中删除的标准不匹配并继续到下一个标准(如果已设置)因此离开你有结果。每个标准都使用确定的比较方法。我希望这会给你一些想法!
答案 4 :(得分:1)
序列:
if((!filterPetsOn || filterPets == trail.pets) &&
(!filterBikingOn || filterBiking == trail.biking) &&
...)
应该做你想要的。