2016-08-19 2 views
1

У меня есть данные uitableview, загруженные из nsmutablearray, но я хочу также фильтровать. данные загружаются отлично, но теперь мне нужно применить к ним функцию фильтрации и перезагрузить таблицу. Вот мой код так далеко, что я написал для фильтрации, но ее не работаетФильтрация 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]; 

    } 

numberOfBudget и numberOfDistance простые ИНТ значения получая от uislider. 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]); 

все эти значения НИТИ

+0

Вы не предсказываете должным образом, нет данных с данными массива? –

+0

hotelDistanceFloat и hotelPrice - значения массива из массива! извините, я не получил его, пожалуйста, вы объясните немного больше. –

+0

Можете ли вы показать, какое значение содержит ваш массив. –

ответ

1

Вы, вероятно, может удалить цикл, вам не нужно назначить массив и создать предикат каждый раз.

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

попытался, но приложение разбилось –

+0

Причина: '- [__ NSCFNumber length]: нераспознанный селектор, отправленный экземпляру 0xb000000000003e82' –

+0

Прохладный, атрибут - строка, поэтому преобразованный в intValue/floatValue исправит сбой :-) – arunit21

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]; 
} 

Вы должны использовать массив, содержащий словарь, и применять fil тер от предиката до этого. Для сортировки содержимого не должно быть необходимости в цикле.

Плюс перезагрузите таблицу после получения фильтрованного массива.

+0

не могли бы вы объяснить, как я могу это сделать –

0

Ваших недостатков

  1. Вы фильтрация массива при перечислении массива.
  2. Значения предикатов выбираются из массива, который должен быть отфильтрован.

Что вы должны сделать:

  1. Получит значение предиката от входа (hotelDistanceFloat, numberOfDistance).
  2. применяется предикат, как:

_

NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"(hotelPrice <= %d AND numberOfBudget <= %d)" , hotelDistanceFloat,numberOfDistance]; 

TableArray = [[TableArray filteredArrayUsingPredicate:sPredicate].mutableCopy] 
+0

где я должен положить этот код? как он получит hotelPrice ?? если я так выразился? –

+0

Ваша потребность получить значения фильтрации от ввода от того, где вы устанавливаете фильтры. –

+0

Поместите этот код всякий раз, когда вы хотите применить фильтр. –

Смежные вопросы