OStack程序员社区-中国程序员成长平台

标题: ios - UISearchBar 在搜索结果中显示多个部分标题 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 08:54
标题: ios - UISearchBar 在搜索结果中显示多个部分标题

我有一个应用程序,当有人使用搜索栏过滤 UITableView 中的对象时,会显示两个部分标题。一个是静止的,另一个随着搜索结果移动。请参阅附上的两个屏幕截图。

下面我已经包含了我的应用程序中的 tableview 方法,任何帮助或建议将不胜感激。

enter image description here

enter image description here

        - (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;
}



Best Answer-推荐答案


我遇到了同样的问题,这解决了它:在“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