最近、タスクが登場しました-アプリケーションに動的な情報検索を組み込むため、つまり、ユーザーが文字を入力するのと並行して出力を生成する必要があります。 すべての情報はSQLiteデータベースに保存されます。 すべて問題ありませんが、検索の各単語で目的の文字を強調表示する必要があります。
外部ライブラリを使用せず、独自にそれを実行しようとするという強い意思がありました。
外部フォームから始めましょう。
検索文字列はUISearchBarです。 結果は、通常のUITableViewに表示されます (この場合は、画像を含むテキストに加えて、セルとともに)。
文字列内のテキスト変更イベントのハンドラーは次のとおりです。
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { _data = [SBHotspotData findHotspot:searchText]; [self.searchResultsTableView reloadData]; }
_dataは、出力の結果を保存するNSArrayです。
この段階で問題が発生しました-検索するオブジェクトのすべての名前には大文字と小文字の両方があり、SQLiteは異なる解釈をし、SQLとは異なりlower()とupper()関数はサポートされていません。 少なくとも抵抗なしに、彼らはすべて同じヘッダーを格納するデータベースに別の列を追加することにしましたが、特にこの場合はデータベースのボリュームの増加がほとんど感知されないため、小文字でした。 検索方法(FMDatabaseライブラリを使用してデータベースを操作します):
+ (NSArray *) findHotspot: (NSString *)partOfTitle { SBHotspotData *item; NSMutableArray *result = [NSMutableArray array]; NSString *path = [self getDatabasePath]; FMDatabase *database; database = [FMDatabase databaseWithPath:path]; [database open]; NSString *query = [NSString stringWithFormat:@"select * from hotspots where TitleLow like '%%%@%%'", [partOfTitle lowercaseString]]; FMResultSet *results = [database executeQuery:query]; while([results next]) { item = [[SBHotspotData alloc ]init]; item.hotspotIdentity = [results stringForColumn:@"Identity"]; item.hotspotTitle = [results stringForColumn:@"Title"]; item.hotspotDescription = [results stringForColumn:@"Description"]; [result addObject:item]; } [database close]; return [result sortedArrayUsingSelector:@selector(compare:)]; } - (NSComparisonResult)compare:(SBHotspotData *)otherObject { return [self.hotspotTitle compare:otherObject.hotspotTitle]; }
クエリを作成するとき、 %%% @ %%が使用されます。パーセント記号は、任意の数の文字が行の前後に移動できることを示します。 このメソッドは、データベースからアルファベット順にソートされたオブジェクトの配列を返します。
タスクの最も興味深い部分は、入力した文字の強調表示です。 次のように実装されます。
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:item.hotspotTitle]; NSRange range = [item.hotspotTitle rangeOfString:_searchHotspotBar.text]; [attributedString addAttribute:NSBackgroundColorAttributeName value:[UIColor colorWithRed:216/255.0f green:87/255.0f blue:23/255.0f alpha:1.0f] range:range]; cell.cellLabel.attributedText = attributedString;
NSMutableAttributedStringとそのaddAttribute :value:range:メソッドは、特定の文字を強調表示するために使用されます。
さて、プログラムの結果:
タスクは非常に簡単であることが判明しましたが、得られた経験がハブロフスク市民の1人に役立つことを願っています。