Серый UISearchBar с соответствующей областью видимости программно - PullRequest
9 голосов
/ 02 июня 2010

Я пытаюсь воссоздать этот UISearchBar (как видно из кода примера поиска по таблице):

альтернативный текст http://img168.imageshack.us/img168/6378/43558113.png

Все примеры, которые я видел, чтобы сделать это, включают использование XIB, однако мне нужно сделать это программно. Проблема с изменением цвета оттенка также изменяет оттенок кнопки отмены:

альтернативный текст http://img243.imageshack.us/img243/1375/screenshot20100527at944.png

Есть идеи?

Ответы [ 3 ]

17 голосов
/ 01 июля 2010

Связывание панели поиска с UISearchDisplayController волшебным образом обеспечивает много стандартного вида и поведения, таких как:

  • серый оттенок без воздействия на кнопку отмены
  • автоматическое отображение / скрытие кнопки отмены
  • настройка ширины вокруг любых табличных индексов

В моем контроллере таблиц я сделал следующее:

- (void)viewDidLoad {
    [super viewDidLoad];

    // setup searchBar and searchDisplayController

    UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero];
    [searchBar sizeToFit];
    searchBar.delegate = self;
    searchBar.placeholder = @"Search";
    self.tableView.tableHeaderView = searchBar;

    UISearchDisplayController *searchDC = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];

    // The above assigns self.searchDisplayController, but without retaining.
    // Force the read-only property to be set and retained. 
    [self performSelector:@selector(setSearchDisplayController:) withObject:searchDC];

    searchDC.delegate = self;
    searchDC.searchResultsDataSource = self;
    searchDC.searchResultsDelegate = self;

    [searchBar release];
    [searchDC release];
}
16 голосов
/ 13 октября 2010

Я полностью согласен с Скоттом МакКаммоном .

Однако использование performSelector:withObject: на setSearchDisplayController: не будет моим подходом. Это зависит от частного API, который может измениться в любой момент. Если Apple удалит их частную реализацию, ваше приложение упадет.

Лучшим способом было бы переопределить searchDisplayController: в вашем контроллере представления, чтобы вернуть ваш экземпляр UISearchDisplayController:


- (UISearchDisplayControlelr *) searchDisplayController {
    return yourInstanceOfASearchController;
}
1 голос
/ 04 мая 2011

Я не понимаю необходимости вызова setSearchDisplayController: или переопределения для searchDisplayController. В iOS 4.3.2 initWithSearchBar:contentsController:, кажется, устанавливает searchDisplayController для экземпляра UIViewController, переданного в качестве аргумента contentsController. Возможно, это было проблемой в более ранних версиях iOS, но в текущем выпуске она выглядит избыточной.

...