2015-10-30 9 views
1

Я пытаюсь использовать API CoreSpotlight в приложении, у меня есть файл plist, который содержит несколько элементов, например, имя животного. Поэтому мне нужно установить строку title, равную значению этого объекта, например, если пользователи ищут Lion, имя линии и, например, ее функции отображаются в центре внимания. Вот мой код:Установить свойство title из NSarray в CSSearchableItemAttributeSet

- (void)setupCoreSpotlightSearch 
{ 

    CSSearchableItemAttributeSet *attibuteSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(__bridge NSString *)kUTTypeImage]; 


    NSURL *url = [[NSBundle mainBundle] URLForResource:@"animals" withExtension:@"plist"]; 
    NSArray *playDictionariesArray = [[NSArray alloc ] initWithContentsOfURL:url]; 
    NSString *getNames = [NSString stringWithFormat:@"%@",playDictionariesArray]; 
    NSLog(@"%@",getNames) ; 


    attibuteSet.title =getNames; 
    attibuteSet.contentDescription = @"blah blah "; 


    CSSearchableItem *item = [[CSSearchableItem alloc] initWithUniqueIdentifier:@"app name" 
                   domainIdentifier:@"com.compont.appname" 
                    attributeSet:attibuteSet]; 
    if (item) { 
     [[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:@[item] completionHandler:^(NSError * _Nullable error) { 
      if (!error) { 
       NSLog(@"Search item indexed"); 
      } 
     }]; 
    } 
} 

Проблема заключается в том getNames возвращает все имена !!! как я могу отфильтровать его, когда пользователь ищет определенное слово от animals.plist Спасибо.

EDIT [Plist Image]: enter image description here

ответ

1

Вы можете сохранить NSArray и перебирать playDictionariesArray, создавая & инициализацию объекта CSSearchableItem с этой конкретной записью в источнике данных.

- (void)setupCoreSpotlightSearch 
{ 
    NSURL *url = [[NSBundle mainBundle] URLForResource:@"animals" withExtension:@"plist"]; 
    NSArray *playDictionariesArray = [[NSArray alloc ] initWithContentsOfURL:url]; 
    NSMutableArray * searchableItems = [[NSMutableArray alloc]init]; 
    for(object in playDictionariesArray) 
    { 
     CSSearchableItemAttributeSet *attibuteSet = [[CSSearchableItemAttributeSet alloc] initWithItemContentType:(__bridge NSString *)kUTTypeImage]; 

     attibuteSet.title =[NSString stringWithFormat:@"%@",object]; //retrive title from object and add here 
     //attibuteSet.contentDescription = @"blah blah "; // retrieve description from object and add here 


     CSSearchableItem *item = [[CSSearchableItem alloc] initWithUniqueIdentifier:@"app name" 
                  domainIdentifier:@"com.compont.appname" 
                   attributeSet:attibuteSet]; 
     [searchableItems addObject:item]; 
    } 

    if (searchableItems) { 
     [[CSSearchableIndex defaultSearchableIndex] indexSearchableItems:searchableItems completionHandler:^(NSError * _Nullable error) { 
      if (!error) { 
       NSLog(@"Search item indexed"); 
      } 
     }]; 
    } 
} 

Я не запускал и не тестировал код.

+0

Почему вы удалили 'attibuteSet.title' ?? Это моя основная проблема и должна иметь значение –

+0

playDictionariesArray будет содержать список всех имен. Таким образом, вы можете установить заголовок как 'attributeSet.title = object'. Вы можете проверить изменение. –

+0

Я изменяю объект на 'for (NSString * name в playDictionariesArray)' и устанавливает 'attributeSet.title = name', но проблема в том, что последний элемент моего файла plist доступен для поиска, который является' Birds' У меня есть много других животных! –

0

Вы не перебираете каждую клавишу. Используйте код, указанный в этом вопросе.

CoreSpotlight indexing

Попробуйте на устройстве, которое поддерживает индексацию. НЕ iPhone 4/4s или iPad.

+0

Вы не называете 'NSLog (@" Search item indexed ");' вообще! кажется, ничего не работает. Я называю это 'self spotLightIndexing]' в 'viewDidLoad' –

+0

Позвоните в viewWillAppear ... Но вам нужно установить bool для запуска только один раз. В противном случае он будет запускаться при каждом запуске. –