6

私は を実装しており、テキストが入力される前に、ロード時に tableView (フィルター処理されていない) のコンテンツをUISearchDisplayControllerに入力したいと考えています。searchResultsTableView

これは、searchBar に値を入力し始めると機能します。

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
    self.isSearching = YES;

    //tell the searchDisplayTableView to show here!

    [controller.searchBar setShowsCancelButton:YES animated:YES];
}

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller {
    self.isSearching = NO;
    [controller.searchBar setShowsCancelButton:NO animated:YES];
}

誰かが正しい方向への指針を持っていますか?

「そんなことはしないでください」とか「Apple はそのようにコントロールを設計していません」などと返信しないでください。また ...

4

4 に答える 4

0

検索を行っているときに、フィルタリングされた結果を使用してテーブル ビューをリロードする必要があります。このメソッドでは、 table view を呼び出すだけreloadDataです。

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
    self.isSearching = YES;
    [yourTableView reloadData];
    [controller.searchBar setShowsCancelButton:YES animated:YES];
}

numberOfSectionsInTableViewメソッドを次のように変更します。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    if(isSearching == YES)
   {
        yourDataArray = //filtered result;
   }
   else
   {
        yourDataAray = //unfiltered result;
   }
   return 1;
}

それがあなたを助けることを願っています。

于 2012-07-28T09:32:44.093 に答える
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:30:39.203 に答える
0

Apple のコントロールはそのように機能します。検索バーのデリゲートであり、データソースに述語を適用する別のコントローラー (検索表示コントローラーと呼びます) オブジェクトを実装することで解決しました。このようにして、テーブルビューは「インライン」でフィルタリングされます。

于 2014-09-16T22:20:44.890 に答える
0
- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller
{
    // Here is a table we want to show in UISearchDisplayController
    XXRecentSearchDataSource *recentSearch = [XXRecentSearchDataSource recentSearchDataSource];
    recentSearch.delegate = self;

    // Setup default table view
    CGRect frame = CGRectMake(0.0f,
                       CGRectGetMaxY(controller.searchBar.frame),
                       CGRectGetWidth(self.view.bounds),
                       CGRectGetHeight(self.view.bounds) - CGRectGetHeight(controller.searchBar.bounds));

    // Setup temporary table and remember it for future use
    [_tempRecentSearchTableView release];
    _tempRecentSearchTableView = [[UITableView alloc] initWithFrame:frame
                                                               style:UITableViewStylePlain];
    _tempRecentSearchTableView.dataSource = recentSearch;
    _tempRecentSearchTableView.delegate = recentSearch;

    [self performSelector:@selector(removeOverlay) withObject:nil afterDelay:.0f];
}

- (void)removeOverlay
{
    [[self.view.subviews lastObject] removeFromSuperview];
    [self.view addSubview:_tempRecentSearchTableView];
}

場合によっては、_tempRecentSearchTableView を忘れずに削除する必要があります。例えば:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    // Remove temporary table view
    [_tempRecentSearchTableView removeFromSuperview];
}
于 2013-01-22T21:30:10.147 に答える