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".

Другие вопросы по тегам