2014-02-05 3 views
0

Я следующий NSObject:массив фильтров Привычка с использованием предиката SearchBar

@interface finalObject : NSObject 

@property NSString *name; 
@property NSString *image; 

который я объявляю, как это в моем ViewController:

finalArray = [[NSMutableArray alloc] init]; 
object = [finalObject new]; 

Тогда я зацикливание thename и изображение в object.name и object.image и добавьте этот объект в NSMutableArray, называемый finalArray.

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { 
    if ([elementName isEqualToString:@"language"]) { 
     thename = attributeDict[@"name"]; 
     theimage = attributeDict[@"image"]; 
     theId = attributeDict[@"id"]; 



     object.name = thename; 
     object.image = theimage; 

     NSArray *cols = @[thename, theimage, theId ]; 

     [finalArray addObject:object]; 

     [rows addObject: cols]; 
    } 

теперь я нужен мой searchbar.text искать через finalarray, что я делаю с помощью этого метода:

-(void) searchThroughdata { 

    self.filteredArray = nil; 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains [cd] %@",self.searchBar.text]; 

    self.filteredArray = [[finalArray filteredArrayUsingPredicate:predicate] mutableCopy]; 

} 

Проблема в том, что finalArray в:

[[finalArray filteredArrayUsingPredicate:predicate] 

должен содержать только имя, а не изображение. Как я могу это сделать?

на данный момент я получаю эту ошибку:

'NSInvalidArgumentException', reason: 'Can't use in/contains operator with collection 
<finalObject: 0x8c4f910> (not a collection)' 

я пытался добавить self.name к "SELF содержит [CD]% @"

+0

От взглядов этого вы только добавление одного объекта в массив. Можете ли вы опубликовать полный код для заполнения массива, а не только фрагменты? – Putz1103

+0

Я добавил его сейчас. – user3258468

+0

Операция 'object = [finalObject new];' не имеет для меня смысла. Вы называете 'new' на полностью включенном объекте' finalObject'? – Macondo2Seattle

ответ

0

The problem is that finalArray ... should only contain the name and not the image

Вы не можете сделать это с предикат. Вы можете фильтровать массив на «имя» собственность ее элементов:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains [cd] %@",self.searchBar.text]; 
NSArray *filteredArray = [finalArray filteredArrayUsingPredicate:predicate]; 

, а затем, при необходимости, создать новый массив, содержащий только имена объектов:

NSArray *filteredNames = [filteredArray valueForKey:@"name"]; 

Заметим также, , как уже отмечалось выше, ваш код создает только один объект, , который неоднократно модифицируется и добавляется в массив. Поскольку массив содержит указатели своим элементам, вы закончите с массивом идентичными объектами.

Создание должен быть перемещен в

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict { 
    if ([elementName isEqualToString:@"language"]) { 
     thename = attributeDict[@"name"]; 
     theimage = attributeDict[@"image"]; 
     theId = attributeDict[@"id"]; 

     FinalObject *object = [FinalObject new]; 
     object.name = thename; 
     object.image = theimage; 
     [finalArray addObject:object]; 

     // ... 
    } 
} 

Update: Если я правильно понял ваш комментарий правильно, вы не должны создать массив , содержащий только имена. Просто создать отфильтрованный массив как

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains [cd] %@",self.searchBar.text]; 
NSArray *filteredArray = [finalArray filteredArrayUsingPredicate:predicate]; 

Тогда, в cellForRowAtIndexPath, доступ к свойствам объектов, например:

FinalObject *object = filteredArray[indexPath.row]; 
cell.textLabel.text = object.name; 
// ... do something with object.image ... 
+0

Хорошо, теперь это работает, когда finalArray содержит только имя, но затем filterArray не знает, какое изображение связано с именем. – user3258468

+0

@ user3258468: Я обновил ответ, надеюсь, что это поможет. –

+1

Работает отлично! Спасибо – user3258468

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