2017-08-24 52 views
0

我使用以下代码在数组中搜索在UISearchBar中键入的短语,然后添加该短语所在的索引的内容找到将显示在表视图中的数组。搜索并找到一个短语并获取它之前和之后的两个单词

-(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]; 
} 

然而,AllWholeText阵列的各项指标中含有大量的文字,我不希望添加整个对象(即搜索到的这句话被发现)为wholeTextOfDoaasLive阵列。相反,我只想在它的前后添加一个找到的短语加两个单词到我的wholeTextOfDoaasLive数组中。我怎样才能做到这一点?

+0

我不认为这是一个简单的问题。更简单的解决方案是显示:“... upTo10CharBefore_SearchedText_upTo10CharAfter ...”,而不是“upToToWordsBefore_SearchedText_upTo10WordsAfter”。其中一个复杂的部分是,如果'enteredSearchText'是“我”,并且你有像“Hi There”这样的句子(它结合了更多的单词等) – Larme

回答

0

所以我写了这个代码,它只是把搜索到的短语放到上下文中,如果它接近段落的尾部(该段落在数组的索引内),那么它会显示“少”字它在表格单元格中的,如果它不是接近结束,那么“很少”的单词会在之后被显示为

-(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]; 
} 

它不会做什么我原来问(两个词,而不是“少数”),但我认为这是因为对于这样我保证文本的数量短语前显示的用户提供更好的在tableview的每个单元格中大致相同(可以使它更准确)。

相关问题