NSP предикат сбой
В searchBar у меня есть следующий код
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { [searchBar resignFirstResponder]; self.filteredResults = [[NSMutableArray alloc] init]; NSPredicate* предикат = [NSPredicate предикат WithFormat:@"(%K == %@)", поле1, поле2]; self.filteredResults = (NSMutableArray *)[originalArray FilterArrayUsingPredicate: предикат]; }
РЕДАКТИРОВАТЬ:
- (BOOL) searchBarShouldBeginEditing: (UISearchBar *) searchBar { originalArray = [[NSArray alloc] initWithContentsOfFile: path]; вернуть ДА; }
Во второй раз, когда я запускаю предикат, программа падает при назначении self.fiteredResults
в searchBarSearchButtonClicked:searchBar
сообщение. Если я включу [self.filteredResults removeAllObjects]
затем программа падает там, поэтому она была удалена, и все равно она не будет работать во второй раз, когда выполняется поиск. Выделяется ли что-нибудь в этом коде причиной сбоя, или я должен искать в другом месте? Заранее спасибо.
3 ответа
Эта строка:
originalArray = [[NSFileManager defaultManager] fileExistsAtPath:path];
Потому что вы пытаетесь установить BOOL
к атрибуту массива.
Вы должны сделать изменяемую копию массива:
self.filteredResults = [[originalArray filteredArrayUsingPredicate:predicate] mutableCopy];
Исходный массив был назначен правильно,
полный код для работы:
- (void) searchBarSearchButtonClicked: (UISearchBar *) searchBar { [searchBar resignFirstResponder]; NSString * documentsDirectory = [NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex: 0]; NSString * path = [documentsDirectory stringByAppendingPathComponent: @ "plist.plist"]; if ([[NSFileManager defaultManager] fileExistsAtPath: путь]) { self.arrayFromCloud = [[NSArray alloc] initWithContentsOfFile:path]; } eventFromCloud = [[NSMutableArray alloc] init]; для (NSDictionary* dic в self.arrayFromCloud) { [eventFromCloud addObject:[dic valueForKey:@"event"]]; } [eventFromCloud removeObjectAtIndex:0]; self.filteredResults = [[NSMutableArray alloc] init]; searchBar.placeholder = @"ПОИСК"; // Фильтруем массив с помощью NSPredicate NSPredicate * предикат = [NSPredicate предикат WithFormat:@"(%K == %@)", @"название места встречи", @"starbucks"]; self.filteredResults = [[eventFromCloud FilterArrayUsingPredicate: предикат] mutableCopy]; searchBar.text = nil; self.arrayFromCloud = ноль; eventFromCloud = ноль; self.filteredResults = nil; }
Единственный способ заставить этот код работать, это выделить / инициализировать промежуточный массив и массив результатов, которые будут использоваться во время второго поиска. Первоначально даже не представлял, что это могло быть причиной ошибки.
Существует проблема с тем, как вы написали свой предикат. Объекты в вашем массиве не содержат свойство "field1".