10

I have a searchDisplayController that searches a UITableView.

After entering the search terms, I can see another UITableView that contains the search results. However, I want this UITableView to be GROUPED, not PLAIN (like it is by default).

How do I do this?

Michael Currie
  • 13,721
  • 9
  • 42
  • 58
Noam
  • 3,100
  • 3
  • 16
  • 19

6 Answers6

15

This worked for me (iOS 5.0):

self.searchController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
[self.searchController setValue:[NSNumber numberWithInt:UITableViewStyleGrouped]
        forKey:@"_searchResultsTableViewStyle"];
Steve Dekorte
  • 219
  • 3
  • 2
14

If - like me - you think the plain TableView was way too ugly, you can also abandon the use of SearchDisplayController.

I just:

  • inserted in an empty View a searchBar and a TableView as we usually do for IBOutlet
  • selected the File's owner as delegate for both of them.
  • At the beginin the number of section is 0 ([myTab count]) then I used reloadData and this time myTab is populated by the result.
  • [self.resultTableView reloadData];

Here you can find all the method I used from the delegates

@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

After all, the simplest solution is often the best...

chriscatfr
  • 2,592
  • 3
  • 24
  • 32
  • 1
    This is a great insight and really streamlined the use of a search bar in my application. Thanks! – Luke May 29 '11 at 00:14
3

This works for me:

Create a class which extends UISearchDisplayController:

@interface RVSearchDisplayController : UISearchDisplayController
@end

@implementation RVSearchDisplayController

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

@end

Then add a UISearchDisplayController to your table using IB, and change its Custom Class to RVSearchDisplayController in Identity Inspector.

Matthew
  • 1,363
  • 11
  • 21
1

You could try to create a subclass of UISearchDisplayController and make searchResultsTableView searchable

in any .h file add:

@interface YourUISearchDisplayController : UISearchDisplayController {
   UITableView * searchResultsTableView;
}

@property (nonatomic) UITableView * searchResultsTableView;

@end;

Then just use YourUISearchDisplayController instead od UISearchDisplayController.

Note: you might have to use (nonatomic, retain), (nonatomic, assign), or (nonatomic, copy). I'm not really sure

Jason O. Jensen
  • 301
  • 2
  • 6
  • "Then just use YourUISearchDisplayController instead of UISearchDisplayController." So this is what I did: myUISearchDisplayController = [[MyUISearchDisplayController alloc] initWithStyle:UITableViewStyleGrouped]; self.searchDisplayController.searchResultsTableView = myUISearchDisplayController.searchResultsTableView; But it gives me the error that "/RootViewController.m:472: error: object cannot be set - either readonly property or no setter found " Is there a work-around? – Noam Sep 26 '10 at 07:16
  • @David, I don't think it's possible to override properties in Objective-C, it's only possible to override **methods**. – Jacob Relkin Sep 26 '10 at 09:32
  • Yeah it looks like you're out of luck. Turns out even if you write setters for read-only properties they just keep calling themselves. – Jason O. Jensen Sep 27 '10 at 17:09
  • As an afterthought: you can ask apple to change it, though I don't know what the odds are there. – Jason O. Jensen Sep 27 '10 at 17:11
  • You could try adding a standalone method to your derived class instead of trying to override a readonly property (which you can't): `-[YourUISearchDisplayController setSearchResultsTableViewStyle:]` – Ben Collins Oct 29 '13 at 16:36
0

This is not possible as the searchResultsTableView property is readonly.

Jacob Relkin
  • 161,348
  • 33
  • 346
  • 320
  • so basically there is absolutely no way to change it to a grouped style? that's absurd that apple would refrain us from doing such a thing.. – Noam Sep 26 '10 at 05:27
0

Overriding -searchResultsTableView won't work, because UISearchDisplayController accesses its table view instance variable directly, without calling the method.

The designated initializer for UISearchDisplayController appears to be a private method, -initWithSearchBar:contentsController:searchResultsTableViewStyle:, which sets the _searchResultsTableViewStyle instance variable. This instance variable is used in creating the search results table view. The public initializer calls this method, passing UITableViewStylePlain.

Directly calling the private designated initializer or setting the instance variable would likely get an application rejected from the App Store, so you might instead try overriding the public initializer and calling

[self setValue:[NSNumber numberWithInt:UITableViewStyleGrouped]
        forKey:@"searchResultsTableViewStyle"];
lemnar
  • 4,063
  • 1
  • 32
  • 44