Search Bar - видовое представление панели поиска

Панель поиска предоставляет интерфейс для поиска на основе текста с текстовым полем ввода и кнопками, такими как "Поиск" и "Отмена". Панель поиска принимает текст от пользователя, который может быть использован как ввод для поиска. Панель параметров (Scope Bar) доступна только в связке с панелью поиска, и позволяет задать параметры для поиска. Панель параметров располагается под панелью поиска.

Search Bar iOS

Панель поиска реализована в классе UISearchBar.

Настройка Search Bar может быть выполнена в Interface Builder, в секции Search Bar инспектора атрибутов. Однако не все виды настройки могут быть выполнены в инспекторе атрибутов, и вы должны их сделать программно. Также вы можете выполнить все настройки программно, при желании.

Контент для Search Bar

Поле Text (свойство text) содержит текущий текст для поиска, вы можете установить это значения для инициирования поиска. Не используйте это свойство для предоставления описания поиска, для этого используйте поле Placeholder (свойство placeholder).

Текст запроса задается в поле Prompt (свойство prompt). Запрос выводится прямо поверх панели поиска. В отличии от Placeholder, текст запроса выводится постоянно, вне зависимости от заполнения текстового поля поиска.

Панель поиска может содержать несколько различных кнопок. Кнопка "Отмена" должна прекращать операцию поиска, вы можете отобразить эту кнопку, выбрав Shows Cancel Button. Кнопки Search Results и Bookmarks распологаются справой стороны панели поиска, и могут выводить соответствующие им видовые представления. Вы можете отобразить одну из данных кнопок, выбрав Shows Search Results Button (свойство showsSearchResultsButton) или Shows Bookmarks Button (свойство showsBookmarkButton) соответственно. Однако вы не можете вывести обе эти кнопки одновременно, при выборе обеих этих опций,- выведется только Search Results. И наконец, чтобы эти кнопки функционировали, необходимо реализовать методы UISearchBarDelegate.

Чтобы предоставить пользователю возможность ограничить поиск, вы можете отобразить панель параметров поиска (Scope Bar). Чтобы это сделать выберите Shows Scope Bar (свойство showsScopeBar) и добавьте массив строк для заголовков в поле Scope Titles (свойство scopeButtonTitles).

Поведение панели поиска

Панель поиска нуждается в делегате для обработки пользовательских действий. Реализуйте протокол UISearchBarDelegate в назначенном делегате (свойство delegate), чтобы обрабатывать действия пользователя.

Пример использования панели поиска

Создадим новый проект Xcode iOS приложения с одним видом. Разместим на главном виде панель поиска, метку и многостроковое текстовое поле для отображения результата, как показано ниже:

Назначаем в качестве делегата панели поиска видовой контроллер вида, в котором непосредственно расположена панель, и отредактируем его заголовочный файл:

Листинг ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UISearchBarDelegate>
{
  NSArray* arrayCars;
  IBOutlet UITextView *resultTextview; // указатель на текстовое поле с результатом
}

@end

Реализуем необходимую часть протокола UISearchBarDelegate в файле реализации видового представления.

Листинг ViewController.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  // Do any additional setup after loading the view, typically from a nib.
  //Инициализируем наш источник данных
  arrayCars = [NSArray arrayWithObjects:@"Audi",@"BMW",@"Fiat",@"Volkswagen",@"Chevrolet",@"Opel",
               @"Mercedes",@"Ford",@"Cherry", nil];
  
}

- (void)didReceiveMemoryWarning {
  [super didReceiveMemoryWarning];
  // Dispose of any resources that can be recreated.
}

// Данный метод вызывается всякий раз, как только изменяется текст в поле поиска панели поиска
- (void)searchBar:(UISearchBar * _Nonnull)searchBar
    textDidChange:(NSString * _Nonnull)searchText{
  resultTextview.text = @""; // Обнуляем предыдущий текст результата поиска
  if(searchText.length){
    // Создаем предикат для поиска по массиву
    NSPredicate* pred = [NSPredicate predicateWithFormat:@"SELF BEGINSWITH[c] %@",searchText];
    // Получаем новый массив с результатами поиска
    NSArray* arr = [arrayCars filteredArrayUsingPredicate:pred];
    NSMutableString* stringResult = [NSMutableString string];
    // Выполняем перечисление массива
    for (NSString* s in arr){
      [stringResult appendFormat:@"%@, ",s ];
    }
    resultTextview.text = stringResult;
  }
}
@end

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

Результат работы:

Search Panel iOS iPhone 5s example
 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac