2010-06-02 5 views
9

Я пытаюсь воссоздать этот UISearchBar (как показано в таблице Пример поиска кода):Серый UISearchBar ж/сопрягая области видимости бар программно

alt text http://img168.imageshack.us/img168/6378/43558113.png

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

alt text http://img243.imageshack.us/img243/1375/screenshot20100527at944.png

Есть идеи?

ответ

17

ассоциирование панель поиска с UISearchDisplayController волшебно обеспечивает много стандартный вид и поведение, такие как:

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

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

- (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]; 
} 
+0

Проверьте также Joris Kluivers ответ на вопрос о перезаписи searchDisplayController – JOM

+2

В случае, если кто-то думает об использовании этого - мое приложение просто отклонено для использования непубличных API. setSearchDisplayController был виновником. – Rob

+0

Устаревшее для iOS 7 .. –

16

Я полностью согласен с Scott McCammon.

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

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


- (UISearchDisplayControlelr *) searchDisplayController { 
    return yourInstanceOfASearchController; 
} 
1

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

+2

Я проверил еще несколько тестов. searchDisplayController получает назначенный, но не сохраняется, как отметил Скотт МакКэммон выше. Вместо вызова недокументированного API я сохраняю сохраненную ссылку в переменной экземпляра, а затем освобождаю ее в dealloc. – rich

+0

То же самое для меня. Я использую 3 частных переменных экземпляра в файле .m: UISearchBar * searchBar; NSArray * filterList; UISearchDisplayController * searchController ;. Под ARC, я не верю, что вам нужно их обмануть в «dealloc», но я не эксперт. Комбинируя iOS 4 и ARC, вы должны использовать слабые ссылки, но регулярные (сильные) ссылки автоматически игнорируются. –

+0

, по-видимому, лучше использовать свойства для таких объектов, как UISearchDisplayController, не говоря уже о большинстве объектов в целом. Фактически, я не мог заставить работать SDC, если я не объявил свойство. Поэтому я использовал код Скотта МакКэммона и вместо того, чтобы объявлять SDC, я сделал для него частную собственность. – mafiOSo

Смежные вопросы