3

テーブルビューで検索結果を表示するために UISearchDisplayController を使用しています。検索結果が空の場合、UISearchDisplaycontroller の searchResultTableView を非表示にしています。iOS 6.0 までは問題なく動作していましたが、iOS 7 では動作しませんでした。解決策を探していますが、残念ながらまだ見つかりませんでした。次のステートメントを使用して searchResultTableView を非表示にしています

self.searchDisplayController.searchResultsTableView.hidden= はい;

以下は、iOS 6 と iOS 7 のスクリーン ショットです。

ここに画像の説明を入力ここに画像の説明を入力

編集:

私は次の UISearchDisplayController デリゲートメソッドを使用しています

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller
shouldReloadTableForSearchString:(NSString *)searchString
{
 [self filterContentForSearchText:searchString
                           scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
                                  objectAtIndex:[self.searchDisplayController.searchBar
                                                 selectedScopeButtonIndex]]];
return YES;
}


-(BOOL)searchDisplayController:(UISearchDisplayController *)controller
 shouldReloadTableForSearchScope:(NSInteger)searchOption 
  {
[self filterContentForSearchText:[self.searchDisplayController.searchBar text]
                           scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
                                  objectAtIndex:searchOption]];
return YES; 
}


-(void)filterContentForSearchText:(NSString *)searchText scope:(NSString *)scope{
[Appdelegate.arrFilteredDrugSummary removeAllObjects];
[Appdelegate.arrFilteredDrugID removeAllObjects];

for (DrugDetails *drug in Appdelegate.arrDrugSummary)
{
    NSPredicate *predicate = [NSPredicate predicateWithFormat:
                              @"(SELF BEGINSWITH [cd] %@)", searchText];
    if(![drug.tradeName isEqual:[NSNull null]])
    {
        [drug.tradeName compare:searchText options:NSCaseInsensitiveSearch];
        BOOL resultTradeName; 
        if((resultTradeName = [predicate evaluateWithObject:drug.tradeName]))
        {
            if (![Appdelegate.arrFilteredDrugID containsObject:drug.ID])
            {
                [Appdelegate.arrFilteredDrugSummary addObject:drug];
                [Appdelegate.arrFilteredDrugID addObject:drug.ID];
            }
        }
    }
}
if (![Appdelegate.arrFilteredDrugSummary count])
{
    [self.btnAddNewDrug setHidden:NO];
    self.tblview.hidden=YES;
    self.searchDisplayController.searchResultsTableView.hidden = YES;
}
else
{
    [self.btnAddNewDrug setHidden:YES];
    self.tblview.hidden=NO;
    self.searchDisplayController.searchResultsTableView.hidden = NO;
}
[self.searchDisplayController.searchResultsTableView reloadData];
}
4

2 に答える 2

0

私もこの同じ問題に直面しています。こうすれば乗り越えられる

- (void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView
{
    self.searchDisplayController.searchResultsTableView.hidden = YES;
}

結果が見つかった場合は、このコードを使用してsearchDisplayControllerを閉じます

if (yourArray.count != 0) 
{
     // reload your table here
     [self.searchDisplayController setActive:NO animated:YES];
     self.searchDisplayController.searchResultsTableView.hidden = YES;
}

また

検索結果が見つかった場合、このコードを使用して searchDisplayController を非表示にできます

[self searchBarCancelButtonClicked:searchBar];

UISearchBar searchBarCancelButtonClicked デリゲートを呼び出し、

- (void)searchBarCancelButtonClicked:(UISearchBar *)_searchBar {

    if (yourArray.count == 0) {
        self.searchDisplayController.searchResultsTableView.hidden = YES;
    }
    else
    {
        self.searchDisplayController.searchResultsTableView.hidden = NO;
    }
}

お役に立てれば幸いです...!

于 2013-10-03T09:43:12.327 に答える
0

検索バーにフォーカスがあるかどうかがわかります。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if ([_searchBar isFirstResponder]) {
              return [_filteredData count];
    } else {

        id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
        return [sectionInfo numberOfObjects];

    }
}

セルを構成するときは、同じ質問をします

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    static NSString *CellIdentifier = @"CustomCell";
    CustomTableViewCell *cell = (CustomTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Configure the cell...
    if (cell == nil) {
        cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    Entidad *e = nil;

    if ([_searchBar isFirstResponder])
    {
        e = [self.filteredData objectAtIndex:indexPath.row];

    }
    else
    {
        e = [self.fetchedResultsController objectAtIndexPath:indexPath];
    }

    cell.nameLabel.text = e.titulo;
    cell.thumbnailImageView.image = [UIImage imageNamed:@"password-50.png"];
    cell.dateLabel.text = e.sitio;

    return cell;
}

フィルタ パラメータを設定する

-(void)filter:(NSString*)text
{

    _filteredData = [[NSMutableArray alloc] init];


    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];


    NSEntityDescription *entity = [NSEntityDescription
                                   entityForName:@"Entidad" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];


    NSSortDescriptor* sortDescriptor = [[NSSortDescriptor alloc]
                                        initWithKey:@"titulo" ascending:YES];
    NSArray* sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];


    if(text.length > 0)
    {

        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(titulo CONTAINS[c] %@)", text];
        [fetchRequest setPredicate:predicate];
    }

    NSError *error;


    NSArray* loadedEntities = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
    _filteredData = [[NSMutableArray alloc] initWithArray:loadedEntities];

    NSLog(@"%@", _filteredData);

    [self.tableView reloadData];
}

-(void)searchBar:(UISearchBar*)searchBar textDidChange:(NSString*)text
{
    [self filter:text];
}

-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{

    [self filter:@""];

    [_searchBar resignFirstResponder];
    [_searchBar setText:@""];
    [_tableView reloadData];
}

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{

    [_searchBar setShowsCancelButton:YES animated:YES];
}

-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar
{
    [_searchBar setShowsCancelButton:NO animated:YES];
}

私はあなたに仕えたいと思っています、私の英語は非常に限られています

于 2014-05-03T15:29:14.650 に答える