hi everyone
i have tow arrays in my project like this
- (void)viewDidLoad
{
[super viewDidLoad];
deviceName = [[NSArray alloc] initWithObjects: @"iPhone", @"Galaxy", @"iPad", @"iMac", @"HTC One", nil];
companyName = [[NSArray alloc] initWithObjects:@"Apple", @"Samsung", @"Apple", @"Apple", @"HTC", nil];
}
and i am using this code to modify cells..
#pragma mark - Table view data source
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (tableView == self.searchDisplayController.searchResultsTableView) {
return [searchResult count];
} else {
return [deviceName count];
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *identifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];
}
if ([self.searchDisplayController isActive]) {
NSString *name = [searchResult objectAtIndex:indexPath.row];
NSString *company = [companyName objectAtIndex:indexPath.row];
cell.textLabel.text = [NSString stringWithFormat:@"%@ - %@", name, company];
} else {
NSString *name = [deviceName objectAtIndex:indexPath.row];
NSString *company = [companyName objectAtIndex:indexPath.row];
cell.textLabel.text = [NSString stringWithFormat:@"%@ - %@", name, company];
}
return cell;
}
and i am using this code to searching ..
#pragma mark - UISearchDisplayController delegate methods
- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
NSPredicate *resultPredicate = [NSPredicate
predicateWithFormat:@"SELF contains[cd] %@",
searchText];
[searchResult release];
searchResult = [[deviceName filteredArrayUsingPredicate:resultPredicate]retain];
}
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
[self filterContentForSearchText:searchString
scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
objectAtIndex:[self.searchDisplayController.searchBar
selectedScopeButtonIndex]]];
return YES;
}
at beginning the Cells are ok like this
cell1- iPhone - Apple
cell2- Galaxy - Samaung
...
and when i searching to 'htc' the search is working ok but the cell like this
cell1- HTC One - Apple
...
what can i do to fix that?
You have two separate arrays as table view data source:
Then you create a filtered array from
deviceName
, in your exampleIn
cellForRowAtIndexPath
you use the filtered array and the original arraycompanyName
, that's why you get the display "HTC One - Apple".To solve the issue, you should not use two separate arrays as a data source, but a single array of dictionaries, where each dictionary contains the device name and the company name:
You would filter the array like this:
so that
filteredDevices
is also an array of dictionaries, containing name and company for each device. Then, incellForRowAtIndexPath
, you can simply doRemark: I have omitted all retain/release calls, as I work with ARC usually.