Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Динамический поиск строки в iOS

Anna | 2.07.2014 | нет комментариев
Незадолго возникла задача — встроить в приложение динамический поиск информации, то есть выдача должна генерироваться параллельно вводу пользователем символов. Каждая информация хранится в SQLite базе данных. Все бы ничего, но в всяком слове выдачи желанные символы обязаны подсвечиваться.
Было принято волевое решение не применять внешние библиотеки, а испробовать обойтись своими силами.

Начнем с внешней формы.

В качестве поисковой строки применяется UISearchBar. Итоги выводятся в обыкновенный UITableView (в данном случае, с ячейками, помимо текста включающими в себя и картинку).
Обработчиком для события метаморфозы текста в строке является:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    _data = [SBHotspotData findHotspot:searchText];
    [self.searchResultsTableView reloadData];
}

где _data — NSArray, хранящий итоги выдачи.

На этом этапе появилась задача — во всех наименованиях объектов, по которым проводится поиск, есть как заглавные буквы, так и строчные, которые SQLite воспринимает по-различному, а функции lower() и upper(), в различии от SQL, не поддерживаются. Путем наименьшего сопротивления решили добавить в базу данных обособленный столбец, хранящий в себе все те же заголовки, но теснее в нижнем регистре, тем больше, что в данном случае увеличение объема базы было фактически неприметно. Способ поиска (для работы с БД применяется библиотека 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:.

Ну и итог работы программы:

Задача получилась довольно банальной, но, верю, полученный навык сгодится кому-либо из прогровчан.

 

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB