I am having a strange problem when searching for a UITableView using the UISearchDisplayController. The UITableViewController is a subclass of another UITableViewController with the didSelectRowAtIndexPath working method. Without searching, the controller handles the selection perfectly, sending the superclass to the didSelectRowAtIndexPath call, but if I select a cell when searching for the superclass, it gets nothing but the cell is highlighted. Below is the code from my subclass.
@implementation AdvancedViewController
@synthesize searchDisplayController, dict, filteredList;
- (void)viewDidLoad {
[super viewDidLoad];
UISearchBar *mySearchBar = [[UISearchBar alloc] init];
mySearchBar.delegate = self;
[mySearchBar setAutocapitalizationType:UITextAutocapitalizationTypeNone];
[mySearchBar sizeToFit];
self.tableView.tableHeaderView = mySearchBar;
searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:mySearchBar contentsController:self];
[self setSearchDisplayController:searchDisplayController];
[searchDisplayController setDelegate:self];
[searchDisplayController setSearchResultsDataSource:self];
NSData * jsonData = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
NSArray * items = [[NSArray alloc] initWithArray:[[CJSONDeserializer deserializer] deserializeAsArray:jsonData error:nil]];
dict = [[NSMutableDictionary alloc] init];
listIndex = [[NSMutableArray alloc] init];
fullList = [[NSMutableArray alloc] init];
filteredList = [[NSMutableArray alloc] init];
for(NSMutableArray * item in items) {
NSString * firstKey = [[[item objectAtIndex:0] substringWithRange:NSMakeRange(0,1)] uppercaseString];
if ([[firstKey stringByTrimmingCharactersInSet:[[NSCharacterSet letterCharacterSet] invertedSet]] isEqualToString:@""]) firstKey = @"#";
if (![listIndex containsObject:firstKey]) {
[listIndex addObject:firstKey];
[dict setObject:[NSMutableArray array] forKey:firstKey];
}
[[dict objectForKey:firstKey] addObject:[[NSMutableDictionary alloc] initWithObjects:item forKeys:[NSArray arrayWithObjects:@"name", @"url", nil]]];
[fullList addObject:[[NSMutableDictionary alloc] initWithObjects:item forKeys:[NSArray arrayWithObjects:@"name", @"url", nil]]];
}
filteredList = [NSMutableArray arrayWithCapacity:[fullList count]];
}
#pragma mark -
#pragma mark Table view data source
- (NSString *)tableView:(UITableView *)tableView dataForRowAtIndexPath:(NSIndexPath *)indexPath withKey:(NSString *)key {
return (NSString *)((tableView == self.searchDisplayController.searchResultsTableView) ?
[[filteredList objectAtIndex:indexPath.row] objectForKey:key] :
[[[dict objectForKey:[listIndex objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row] valueForKey:key]);
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return (tableView == self.searchDisplayController.searchResultsTableView) ? 1 : (([listIndex count] > 0) ? [[dict allKeys] count] : 1);
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return (tableView == self.searchDisplayController.searchResultsTableView) ? [filteredList count] : [[dict objectForKey:[listIndex objectAtIndex:section]] count];
}
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
return (tableView == self.searchDisplayController.searchResultsTableView) ? [[NSArray alloc] initWithObjects:nil] : listIndex;
}
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return (tableView == self.searchDisplayController.searchResultsTableView) ? @"" : [listIndex objectAtIndex:section];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *kCellID = @"cellID";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellID];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellID] autorelease];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
NSString * name = nil;
if (tableView == self.searchDisplayController.searchResultsTableView) {
name = [[filteredList objectAtIndex:indexPath.row] objectForKey:@"name"];
} else {
name = [self tableView:[self tableView] dataForRowAtIndexPath:indexPath withKey:@"name"];
}
cell.textLabel.text = name;
return cell;
}
#pragma mark Search Methods
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope {
[self.filteredList removeAllObjects];
for (NSDictionary *item in fullList) {
NSComparisonResult result = [[item objectForKey:@"name"] compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])];
if (result == NSOrderedSame) {
[self.filteredList addObject:item];
}
}
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
[self filterContentForSearchText:searchString scope: [[self.searchDisplayController.searchBar scopeButtonTitles]
objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
return YES;
}
- (void)viewDidUnload { filteredList = nil; }
@end
source
share