大家好
我的项目中有两个数组
- (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];
}
我正在使用此代码修改单元格..
#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;
}
我正在使用此代码进行搜索..
#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;
}
一开始,单元格就像这样
cell1- iPhone - Apple
cell2- Galaxy - Samaung
...
当我搜索'htc'时,搜索工作正常,但像这样的单元格
cell1- HTC One - Apple
...
我该怎么做才能解决这个问题?
答案 0 :(得分:2)
您有两个单独的数组作为表视图数据源:
deviceName = [ "iPhone", "Galaxy", "iPad", "iMac", "HTC One"]
companyName = [ "Apple", "Samsung", "Apple", "Apple", "HTC" ]
然后在示例
中从deviceName
创建一个过滤后的数组
searchResult = [ "HTC One"]
在cellForRowAtIndexPath
中,您使用过滤后的数组和原始数组companyName
,这就是显示“HTC One - Apple”的原因。
要解决此问题,您不应使用两个单独的数组作为数据源, 但是一个单个数组字典,其中每个字典包含设备名称和 公司名称:
allDevices = @[
@{@"name": @"iPhone", @"company": @"Apple"},
@{@"name": @"Galaxy", @"company": @"Samsung"},
...
];
您可以像这样过滤数组:
NSPredicate *resultPredicate = [NSPredicate
predicateWithFormat:@"name CONTAINS[cd] %@",
searchText];
filteredDevices = [allDevices filteredArrayUsingPredicate:resultPredicate];
这样filteredDevices
也是一个字典数组,包含名称和
公司为每个设备。然后,在cellForRowAtIndexPath
中,您只需执行
NSDictionary *device;
if ([self.searchDisplayController isActive]) {
device = filteredDevices[indexPath.row];
} else {
device = allDevices[indexPath.row];
}
NSString *name = device[@"name"];
NSString *company = device[@"company"];
cell.textLabel.text = [NSString stringWithFormat:@"%@ - %@", name, company];
备注:我省略了所有保留/释放呼叫,因为我通常使用ARC。