过滤NSMutableArray并将其保存回自身

时间:2016-08-19 06:57:06

标签: ios objective-c iphone uitableview nspredicate

我从uitableview加载了nsmutablearray数据,但我想要过滤。数据加载完美但现在我需要对它应用过滤功能并重新加载表。到目前为止,这是我的代码,我写的是过滤,但它没有工作

NSPredicate *sPredicate;
    for (int i=0; i<TableArray.count; i++) {
        float hotelDistanceFloat = [[[TableArray objectAtIndex:i]xmlhotel_distance] floatValue];
        NSInteger hotelPrice = [[[TableArray objectAtIndex:i]xmlhotel_price] integerValue];

        sPredicate = [NSPredicate predicateWithFormat:@"(%ld <= %d AND %f <= %d)" , (long)hotelPrice, numberOfBudget, hotelDistanceFloat,numberOfDistance];
        TableArray = [[TableArray filteredArrayUsingPredicate:sPredicate] mutableCopy];

    }

numberOfBudgetnumberOfDistance是从uislider获取的简单int值。 TableArray是我的mutablearray,其中包含所有tabledata。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return TableArray.count;
}

这些是我的nsmutablearray包含的值

NSLog(@"Name : %@",[[TableArray objectAtIndex:1]xmlhotel_name]);
NSLog(@"City : %@",[[TableArray objectAtIndex:1]xmlhotel_city]);
NSLog(@"Price : %@",[TableArray objectAtIndex:1]xmlhotel_price);
NSLog(@"Distance : %@",[TableArray objectAtIndex:1]xmlhotel_distance);
NSLog(@"Image : %@",[[TableArray objectAtIndex:1]xmlhotel_image]);
NSLog(@"Stars : %@",[[TableArray objectAtIndex:1]xmlhotel_stars]);

所有这些值都是STRINGS

3 个答案:

答案 0 :(得分:1)

您可能删除for循环,您不需要每次都分配数组并创建谓词。

   NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"(xmlhotel_price.intValue <= %d AND xmlhotel_distance.floatValue <= %f)", numberOfBudget, numberOfDistance];
   NSMutableArray *filteredArray = [NSMutableArray arrayWithArray:[TableArray filteredArrayUsingPredicate:sPredicate]];

答案 1 :(得分:0)

我不确定您面临的确切问题,但这种代码的安静看起来很可疑:

NSPredicate *sPredicate;
for (int i=0; i<TableArray.count; i++) {
    float hotelDistanceFloat = [[[TableArray objectAtIndex:i]xmlhotel_distance] floatValue];
    NSInteger hotelPrice = [[[TableArray objectAtIndex:i]xmlhotel_price] integerValue];

    sPredicate = [NSPredicate predicateWithFormat:@"(%ld <= %d AND %f <= %d)" , (long)hotelPrice, numberOfBudget, hotelDistanceFloat,numberOfDistance];
    TableArray = [[TableArray filteredArrayUsingPredicate:sPredicate] mutableCopy];
}

您应该使用包含字典的数组并将谓词的过滤器应用于该数组。为了对内容进行排序,不需要循环。

一旦获得过滤后的数组,就重新加载表格。

答案 2 :(得分:0)

你的错误

  1. 您在枚举数组时过滤数组。
  2. 从要过滤的数组中选择谓词值。
  3. 你应该怎么做:

    1. 从输入中获取谓词的值(hotelDistanceFloat,numberOfDistance)。
    2. 应用谓词,如:
    3. _

      var slug = product.details.slug