Измените стиль таблицы поиска searchDisplayController для группировки?

У меня есть searchDisplayController, который ищет a UITableView.

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

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

Ответ 1

Если - как и я - вы думаете, что простой 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

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

Ответ 2

Это сработало для меня (iOS 5.0):

self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
[self.searchController 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.

Ответ 4

Вы можете попытаться создать подкласс UISearchDisplayController и сделать searchResultsTableView доступным для поиска

в любом файле .h добавьте:

@interface YourUISearchDisplayController : UISearchDisplayController {
   UITableView * searchResultsTableView;
}

@property (nonatomic) UITableView * searchResultsTableView;

@end;

Затем используйте вместо этого параметр "Использовать свой UISearchDisplayController" вместо UISearchDisplayController.

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

Ответ 5

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

Ответ 6

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

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

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

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