У меня секционированный UITableView с контроллером отображения поиска.Моя проблема в том, что во время поиска в результатах отображаются только строки из первого раздела таблицы.
Мой код ниже:
Сначала в ViewDidLoad я получаю разделы и создаю массив результатов поиска с емкостью, равной общему количеству записей в моей таблице базы данных.
- (void)viewDidLoad
{
[super viewDidLoad];
FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
[db open];
//Loading the sections for the TableView
self.sectionsarray =[[NSMutableArray alloc] init];
FMResults *results = [db executeQuery:@"SELECT distinct section FROM articles where order by section"];
while([results next])
{
NSString *sectioname = [results stringForColumn:@"section"];
[sectionsarray addObject:sectioname];
}
[db close];
//Creating the Array for the search results
self.searchResults = [NSMutableArray arrayWithCapacity:[db intForQuery: [NSString stringWithFormat:@"SELECT count(id) as rowscount FROM Articles"]]];
if (self.savedSearchTerm)
{
[self.searchDisplayController.searchBar setText:savedSearchTerm];
self.savedSearchTerm = nil;
}
[self.tableView reloadData];
}
Приведенный ниже код отвечает за фактический поиск.Он ищет поисковый термин в любой части записи с именем ArticleTags в массиве, в котором хранятся данные для UITableView.
- (void)handleSearchForTerm:(NSString *)searchTerm
{
// Update the filtered array based on the search text
[self.searchResults removeAllObjects];
for (Article *searchplace in masterplacesarray)
{
NSRange range = [searchplace.articletags rangeOfString:searchTerm options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch)];
if (range.location != NSNotFound) {
[self.searchResults addObject:searchplace];
}
}
}
Далее вычисляется количество разделов в табличном представлении
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
if (tableView == [[self searchDisplayController] searchResultsTableView])
return 1;
else {
return [sectionsarray count];
}
}
И это количество строк для каждого раздела
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (tableView == [[self searchDisplayController] searchResultsTableView])
return [[self searchResults] count];
else
{
FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
[db open];
NSUInteger rowscountforsection = [db intForQuery: [NSString stringWithFormat:@"SELECT count(id) as rowscount FROM Articles where section='%@'",[self.sectionsarray objectAtIndex:section]]];
[db close];
return rowscountforsection;
}
}
И это устанавливает заголовок каждого раздела табличного представления
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
if (tableView == [[self searchDisplayController] searchResultsTableView])
return @"Search Results";
else
return [self.sectionsarray objectAtIndex:section];
}
Здесь я создаю ячейки табличного представленияраздел за разделом.Masterplacesarray - это массив, содержащий данные для представления uitableview.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"PlacesCell";
UITableViewCell *cell = [self.mainTableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
// Configure the cell...
FMDatabase *db = [FMDatabase databaseWithPath:[Utility getDatabasePath]];
[db open];
NSString *sectioname = [self.sectionsarray objectAtIndex:indexPath.section];
self.masterplacesarray = [[NSMutableArray alloc] init];
FMResultSet *resultsdata = [db executeQuery:[NSString stringWithFormat:@"SELECT ArticleTitle, ArticlePreview, id, ArticleTags FROM Articles where section='%@'",sectioname]];
while([resultsdata next])
{
Article *articledata = [[Article alloc] init];
articledata.articleid = [resultsdata stringForColumn:@"id"];
articledata.articletitle = [resultsdata stringForColumn:@"ArticleTitle"];
articledata.articlepreview = [resultsdata stringForColumn:@"ArticlePreview"];
articledata.articletags = [resultsdata stringForColumn:@"ArticleTags"];
[masterplacesarray addObject:articledata];
}
[db close];
Article *placecell = [self.masterplacesarray objectAtIndex:indexPath.row];
if (tableView == [[self searchDisplayController] searchResultsTableView])
{
placecell = [self.searchResults objectAtIndex:indexPath.row];
cell.tag = 666;
}
else
{
placecell = [self.masterplacesarray objectAtIndex:indexPath.row];
}
UILabel *childIDLabel = (UILabel *)[cell viewWithTag:999];
childIDLabel.text = placecell.articleid;
UILabel *titleLabel = (UILabel *)[cell viewWithTag:100];
titleLabel.text = placecell.articletitle;
UILabel *previewLabel = (UILabel *)[cell viewWithTag:101];
previewLabel.text = placecell.articlepreview;
// UIImageView *imageview = (UIImageView *)[cell viewWithTag:102];
// [imageview setImage:[UIImage imageNamed:peoplecell.articlethumb]];
return cell;
}