2017-08-24 16 views
0

J'utilise le code suivant pour rechercher dans un tableau la phrase tapée dans un UISearchBar et ensuite ajouter le contenu de l'index que la phrase était trouvé dans le tableau qui sera affiché dans la vue de la table.chercher et trouver une phrase et obtenir deux mots qui sont avant et après

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)enteredSearchText{ 


    if ([enteredSearchText length] == 0) { 

     [wholeTextOfDoaasLive removeAllObjects]; //wholeTextOfDoaasLive is an NSMutableArray 

    } 
    else{ 

     [wholeTextOfDoaasLive removeAllObjects]; 

     for (NSString * string in AllWholeText) {//AllWholeText is an NSMutableArray 

      NSRange r = [string rangeOfString:enteredSearchText options:NSCaseInsensitiveSearch]; 

      if (r.location != NSNotFound){ 

       [wholeTextOfDoaasLive addObject:string]; 
      } 
     } 
    } 

    [_searchResultsTable reloadData]; 
} 

cependant, tous les index du tableau AllWholeText contient de grandes quantités de texte et je ne veux pas ajouter l'ensemble de l'objet (que l'expression recherchée a été trouvée dans) dans un tableau wholeTextOfDoaasLive. Au lieu de cela, je veux seulement ajouter une phrase trouvée plus deux mots avant et après dans mon tableau wholeTextOfDoaasLive. Comment puis je faire ça?

+0

Je ne pense pas que ce soit un problème facile. Une solution plus simple serait de montrer: "... upTo10CharBefore_SearchedText_upTo10CharAfter ..." au lieu de "upToToWordsBefore_Text_upTo10WordsAfter". L'une des complexités est que si 'enteredSearchText' est" i the "et que vous avez des phrases comme" Hi There "(il y a plus de mots, etc.) – Larme

Répondre

0

J'ai donc écrit ce code qui met juste la phrase recherchée dans son contexte, si elle est proche de la fin du paragraphe (le paragraphe qui se trouve dans l'index du tableau) alors elle apparaît avec "avant il dans la cellule tableview, si ce n'est pas près de la fin, puis "quelques" mots sont affichés après.

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)enteredSearchText{ 

    if ([enteredSearchText length] == 0) { 

     [wholeTextOfDoaasLive removeAllObjects]; 

    } 
    else{ 

     [wholeTextOfDoaasLive removeAllObjects]; 

     for (NSString * string in AllWholeText) { //create string that holds the value in that index 

      NSRange r = [string rangeOfString:enteredSearchText options:NSCaseInsensitiveSearch]; 

      NSUInteger indexOfFoundString = r.location; 
      NSUInteger numberOfAvailableCharactersAfterPhrase = string.length - (indexOfFoundString + 1); 

      NSUInteger takeCharacters = 50; //number of characters that will show in tableview cell 
      foundStringIsAtTheEnd =NO; 

      /// START: eliminate the "out of bounds" error /// 
      // if the searched phrase is at the end of the text and you ask for 50 characters after it, the app to crash. So here we check if the searched phrase is the near the end or if it's far away from the end. A) if it's close to the end then show words before it. B) if it's far from the end then show words after it. 

      if (numberOfAvailableCharactersAfterPhrase < 50) { 
       takeCharacters = 40; 

       if (numberOfAvailableCharactersAfterPhrase < 40) { 
        takeCharacters = 30; 

        if (numberOfAvailableCharactersAfterPhrase < 30) { 
         takeCharacters = 20; 

         if (numberOfAvailableCharactersAfterPhrase < 20) { //there is less than 20 characters after the searched phrase 

          takeCharacters = numberOfAvailableCharactersAfterPhrase+30; 
          foundStringIsAtTheEnd =YES; 

         } 

        } 
       } 
      } 
      /// END: eliminate the "out of bounds" error /// 

      if (indexOfFoundString != NSNotFound){ 

       NSString *tableViewString; 

       if (foundStringIsAtTheEnd == YES) { 

        indexOfFoundString -= 30; //to show few words before the searched phrase 

        tableViewString = [string substringWithRange:NSMakeRange(indexOfFoundString, takeCharacters)]; 

        /// START: remove cropped words, we want only full words /// 
        NSArray *arrayStoredText = [tableViewString componentsSeparatedByString:@" "]; 
        NSMutableArray *myMutable = [[NSMutableArray alloc]initWithArray:arrayStoredText]; 
        [myMutable removeObjectAtIndex:0]; //cuz maybe it's a cropped word 
        tableViewString = @""; 
        tableViewString = [myMutable componentsJoinedByString:@" "]; 
        /// END: remove cropped words, we want only full words /// 


       } 
       else{ //if searched phrase is far from the end 

        tableViewString = [string substringWithRange:NSMakeRange(indexOfFoundString, takeCharacters)]; 

        NSArray *arrayStoredText = [tableViewString componentsSeparatedByString:@" "]; 
        NSMutableArray *myMutable = [[NSMutableArray alloc]initWithArray:arrayStoredText]; 
        [myMutable removeLastObject]; //cuz maybe it's a cropped word 
        tableViewString = @""; 
        tableViewString = [myMutable componentsJoinedByString:@" "]; 

       } 

       [wholeTextOfDoaasLiveArray addObject:tableViewString]; 
      } 
     } 
    } 

    [_searchResultsTable reloadData]; 
} 

Il ne fait pas exactement ce que je initialement demandé (deux mots au lieu de « peu ») mais je pense que cela vaut mieux pour l'utilisateur, car cette façon, j'assurer que la quantité de texte affiché avant la phrase dans chaque cellule de la tableview est à peu près la même chose (pourrait le rendre plus précis si).