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


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

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

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

6 10

6 ответов:

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

Я просто:

  • вставил в пустое представление панель поиска и 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
В конце концов, самое простое решение часто оказывается лучшим...

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

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

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

Создайте класс, который расширяет 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.

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

В любом .h file add:

@interface YourUISearchDisplayController : UISearchDisplayController {
   UITableView * searchResultsTableView;
}

@property (nonatomic) UITableView * searchResultsTableView;

@end;

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

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

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

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

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

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

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