10

У меня есть searchDisplayController, который ищет UITableView.Сменить стиль отображения таблицы поискаDisplayController для группировки?

После ввода условий поиска, я вижу еще UITableView, содержащий результаты поиска. Тем не менее, я хочу, чтобы этот UITableView был GROUPED, а не PLAIN (как и по умолчанию).

Как это сделать?

ответ

14

Если - как и я - вы думаете, что простой TableView был слишком уродлив, вы также можете отказаться от использования SearchDisplayController.

Я просто:

  • вставляется в пустой Посмотрите SearchBar и TableView как мы обычно делаем для IBOutlet
  • выбран владелец файла в качестве делегата для них обоих.
  • В начале число секций равно 0 ([myTab count]), тогда я использовал reloadData, и на этот раз myTab заполняется результатом.
  • [self.resultTableView reloadData];

Здесь вы можете найти все метод я использовал от делегатов

@interface MyViewController : UIViewController <UIApplicationDelegate, UISearchBarDelegate> { 

    IBOutlet UISearchBar *searchBar; 
    IBOutlet UITableView *resultTableView; 
} 

@property (nonatomic, retain) IBOutlet UISearchBar *searchBar; 
@property (nonatomic, retain) IBOutlet UITableView *resultTableView; 

    //For your searchBar the 2 most important methods are 
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBarClicked; 
- (BOOL)searchBarTextDidEndEditing; 


    //For your TableView the most important methods are in my case: 

    //number of sections in the table view. 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView; 
    //HEADERS 
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section; 
    //different numbers of row by section 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; 
    //the cells themselves 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; 

@end 

В конце концов, самое простое решение часто является лучшим ...

+1

Это отличная идея и действительно упростило использование поиска бар в моем приложении. Благодаря! – Luke

0

Это не возможно, так как searchResultsTableView является readonly.

+0

поэтому в основном нет абсолютно никакого способа изменить его сгруппированный стиль? это абсурдно, что яблоко будет воздерживаться от этого. – Noam

+0

@ Давид, я знаю, это отстой. :( –

1

Вы могли бы попытаться создать подкласс UISearchDisplayController и сделать searchResultsTableView поиска

в любом .h файле объявления:

@interface YourUISearchDisplayController : UISearchDisplayController { 
    UITableView * searchResultsTableView; 
} 

@property (nonatomic) UITableView * searchResultsTableView; 

@end; 

Тогда просто использовать YourUISearchDisplayController вместо спосо UISearchDisplayController.

Примечание: вам может потребоваться использовать (неатомные, сохраняемые), (неатомные, назначать) или (неатомные, копии). Я не совсем уверен

+0

"Тогда просто использовать YourUISearchDisplayController вместо UISearchDisplayController" Так вот что я сделал: myUISearchDisplayController = [[MyUISearchDisplayController Alloc] initWithStyle: UITableViewStyleGrouped]; \t self.searchDisplayController.searchResultsTableView = myUISearchDisplayController.searchResultsTableView; Но это дает мне ошибку, что «/RootViewController.m:472: ошибка: объект не может быть установлен - либо свойство readonly, либо нет установщика найдено « Есть ли обход? – Noam

+0

@ Давид, я не думаю, что это возможно для переопределения свойств в Objective-C можно только переопределить ** методы **. –

+0

Да, я похоже, что вам не повезло. Оказывается, даже если вы пишете сеттеры для свойств только для чтения, они просто продолжают называть себя. –

0

Перекрытие -searchResultsTableView не будет работать, потому что UISearchDisplayController обращается непосредственно к переменной экземпляра таблицы, не вызывая метод.

Назначенный инициализатор для UISearchDisplayController представляется приватным методом, -initWithSearchBar:contentsController:searchResultsTableViewStyle:, который устанавливает переменную экземпляра _searchResultsTableViewStyle. Эта переменная экземпляра используется при создании представления таблицы результатов поиска. Публичный инициализатор вызывает этот метод, минуя UITableViewStylePlain.

прямого вызова частной назначенный инициализатору или установив переменную экземпляра, скорее всего, получит приложение отвергнут из App Store, так что вы могли бы вместо того, чтобы попробовать перекрывая общественное инициализатору и вызов

[self setValue:[NSNumber numberWithInt:UITableViewStyleGrouped] 
     forKey:@"searchResultsTableViewStyle"]; 
3

Это работает для меня:

Создать класс, который расширяет UISearchDisplayController:

@interface RVSearchDisplayController : UISearchDisplayController 
@end 

@implementation RVSearchDisplayController 

-(UITableView *) searchResultsTableView { 
    [self setValue:[NSNumber numberWithInt:UITableViewStyleGrouped] 
      forKey:@"_searchResultsTableViewStyle"]; 
    return [super searchResultsTableView]; 
} 

@end 

Затем добавить UISearchDisplayController в таблицу с использованием IB и измените свой собственный класс на RVSearchDisplayController в Identity Inspector.

+3

Считает ли это, что с помощью частного api? – chakrit

15

Это работает для меня (IOS 5,0):

self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self]; 
[self.searchController setValue:[NSNumber numberWithInt:UITableViewStyleGrouped] 
     forKey:@"_searchResultsTableViewStyle"]; 
+0

Это на самом деле лучшее решение в этом посте. БЛАГОДАРЯ! – jcdmb

+0

Это тоже работает для меня, iOS 5.1 – jxdwinter

+6

'_searchResultsTableViewStyle', похоже, не документирован ... Будет ли это одобрено Apple? –