我有一个应用程序,当有人使用搜索栏过滤 UITableView 中的对象时,会显示两个部分标题。一个是静止的,另一个随着搜索结果移动。请参阅附上的两个屏幕截图。
下面我已经包含了我的应用程序中的 tableview 方法,任何帮助或建议将不胜感激。
- (void) performFetch
{
[NSFetchedResultsController deleteCacheWithName"Master"];
// Init a fetch request
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName"MainObject" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
// Apply an ascending sort for the color items
//NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey"Term" ascending:YES selector:nil];
NSSortDescriptor *sortDescriptor;
if(sortValue==1)
{
sortDescriptor = [[NSSortDescriptor alloc] initWithKey"fullName" ascending:YES selectorselector(caseInsensitiveCompare];
}
else if(sortValue==2)
{
sortDescriptor = [[NSSortDescriptor alloc] initWithKey"firstName" ascending:YES selectorselector(caseInsensitiveCompare];
}
else if(sortValue==3)
{
sortDescriptor = [[NSSortDescriptor alloc] initWithKey"socialSecurity" ascending:YES selectorselector(caseInsensitiveCompare];
}
NSArray *descriptors = [NSArray arrayWithObject:sortDescriptor];
[fetchRequest setSortDescriptors:descriptors];
// Recover query
NSString *query = self.searchDisplayController.searchBar.text;
if (query && query.length) fetchRequest.predicate = [NSPredicate predicateWithFormat"(fullName contains[cd] %@) || (socialSecurity contains[cd] %@)",query, query];
// Init the fetched results controller
NSError *error;
if(sortValue==1)
{
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"pLLetter" cacheName:nil];
}
else if(sortValue==2)
{
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"pFLetter" cacheName:nil];
}
else if(sortValue==3)
{
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"pSLetter" cacheName:nil];
}
self.fetchedResultsController.delegate = self;
if (![[self fetchedResultsController] performFetch:&error]) NSLog(@"Error: %@", [error localizedDescription]);
[self.tableView reloadData];
}
- (void)searchBarCancelButtonClickedUISearchBar *)searchBar
{
[self.searchDisplayController.searchBar setText:@""];
[self performFetch];
}
- (void)searchBarUISearchBar *)searchBar textDidChangeNSString *)searchText
{
[self performFetch];
}
#pragma mark - Table View
// Customize the number of sections in the table view.
- (NSInteger)numberOfSectionsInTableViewUITableView *)tableView
{
return [[self.fetchedResultsController sections] count];
}
- (NSInteger)tableViewUITableView *)tableView numberOfRowsInSectionNSInteger)section
{
id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
return [sectionInfo numberOfObjects];
}
- (NSString *)tableViewUITableView *)tableView titleForHeaderInSectionNSInteger)section
{
id <NSFetchedResultsSectionInfo> sectionInfo = [[__fetchedResultsController sections] objectAtIndex:section];
return [NSString stringWithFormat:@"%@", [sectionInfo name]];
}
- (NSInteger)tableViewUITableView *)tableView sectionForSectionIndexTitleNSString *)title atIndex:(NSInteger)index {
if (index == 0) {
// search item
[tableView scrollRectToVisible:[[tableView tableHeaderView] bounds] animated:NO];
return -1;
}
return index-1;
}
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
{
// Return the array of section index titles
NSArray *searchArray = [NSArray arrayWithObject:UITableViewIndexSearch];
return [searchArray arrayByAddingObjectsFromArray:self.fetchedResultsController.sectionIndexTitles];
}
// 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) {
if(subtitleValue==1){cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];}
else {cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];}
//cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
[self configureCell:cell atIndexPath:indexPath];
return cell;
}
我遇到了同样的问题,这解决了它:在“performFetch()”中搜索结束时,不要调用 tableView.reloadData(),而是调用
[self.searchDisplayController.searchResultsTableView reloadData];
原因:搜索后,有一个新的tableview,看这里:UITableView Plain Style Section Header gets Redrawn on Search View .
关于ios - UISearchBar 在搜索结果中显示多个部分标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25255954/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |