I try to create a simple app for iPhone.
In it i have a tableview and a detailview of the tableview, and last a searchbar to filter the tableview.
The tableview and detailview works fine, but the searchhbar dos not work as it should.
When i type in a search word it displays the whole tableview and the detailview dos not work
search mode.
When i cancel the search mode the detail view works again.
So obviusly my filter code is wrong, and i haven’t got my detailview inside my filter code but i don’t now how to do that correctly.
Hope someone can help me, my code look like this:
my *.h file:
#import <UIKit/UIKit.h>
@class DetailViewController;
@interface MasterViewController : UITableViewController <UISearchBarDelegate, UISearchDisplayDelegate>
{
NSArray *originalData;
NSMutableArray *searchData;
UISearchBar *searchBar;
UISearchDisplayController *searchDisplayController;
}
@property (strong, nonatomic) DetailViewController *detailViewController;
@end
my *.m file:
#import "MasterViewController.h"
#import "DetailViewController.h"
@interface MasterViewController () {
NSMutableArray *_objects;
}
@end
@implementation MasterViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
self.title = NSLocalizedString(@"Opslag", @"Opslag");
_objects = [[NSMutableArray alloc] init];
//title
//detail
NSDictionary * obj1 = [[NSDictionary alloc] initWithObjectsAndKeys:@"this_title", @"title", @"this_detail", @"detail", nil];
NSDictionary * obj2 = [[NSDictionary alloc] initWithObjectsAndKeys:@"some_title2", @"title", @"some_detail2", @"detail", nil];
NSDictionary * obj3 = [[NSDictionary alloc] initWithObjectsAndKeys:@"some_title3", @"title", @"some_detail3", @"detail", nil];
NSDictionary * obj4 = [[NSDictionary alloc] initWithObjectsAndKeys:@"some_title4", @"title", @"some_detail4", @"detail", nil];
[_objects addObject:obj1];
[_objects addObject:obj2];
[_objects addObject:obj3];
[_objects addObject:obj4];
originalData = [[NSArray alloc] initWithObjects:obj1, obj2, obj3, nil];
searchData = [[NSMutableArray alloc] init];
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 160, 44)];
searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchBar contentsController:self];
searchDisplayController.delegate = self;
searchDisplayController.searchResultsDataSource = self;
self.tableView.tableHeaderView = searchBar;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma mark - Table View
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return _objects.count;
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
cell.textLabel.text = [[_objects objectAtIndex:indexPath.row] objectForKey:@"title"];
cell.detailTextLabel.text = [[_objects objectAtIndex:indexPath.row] objectForKey:@"detail"];
return cell;
}
#pragma mark - searchDisplayControllerDelegate
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
[searchData removeAllObjects];
NSArray *group;
for(group in originalData)
{
NSMutableArray *newGroup = [[NSMutableArray alloc] init];
NSString *element;
for(element in group)
{
NSRange range = [element rangeOfString:searchString options:NSCaseInsensitiveSearch];
if (range.length > 0) {
[newGroup addObject:element];
}
}
if ([newGroup count] > 0) {
[searchData addObject:newGroup];
}
}
return YES;
}
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
// Return NO if you do not want the specified item to be editable.
return YES;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (!self.detailViewController) {
self.detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
}
NSDictionary *object = _objects[indexPath.row];
self.detailViewController.detailItem = [object objectForKey:@"detail"];
self.detailViewController.titleItem = [object objectForKey:@"title"];
[self.navigationController pushViewController:self.detailViewController animated:YES];
}
@end
your
cellForRowAtIndexPathmethod is always picking from your_objectsarray, which you never change when a search is performed. WhenshouldReloadTableForSearchStringis called you only populatesearchData, which is never fed back intocellForRowAtIndexPathandnumberOfRowsInSectionto show the filtered results.One way to handle that is to do something like this (untested) in your
cellForRowAtIndexPath:and also in your
numberOfRowsInSection