3

上部に検索バーがある UITableView があります。同じものを実装するために UISearchDisplayController を使用しました。また、2 つのボタンを備えたスコープ バーもあります。アプリを起動するとデフォルトでスコープバーが表示されます。検索後にキャンセルボタンをクリックすると、スコープバーが消えました。キャンセルボタンを押した後でもスコープバーを保持する方法はありますか。次のコードを使用しましたが、機能しません。

- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar
{
    [searchBar setShowsScopeBar:YES];
    return YES;
}

ありがとう :)

4

3 に答える 3

5

私は今日問題を抱えていましたが、解決策を見つけたと思います。

次の 2 つのことを行う必要があります。

  1. showsScopeBar を設定した後、searchBar で「sizeToFit」を呼び出します。これにより、searchBars フレームがスコープ バーを含むように正しく設定されます。
  2. 残念ながら、検索バーのサイズが変更されてスコープ バーが最初のセルに重なる場合、テーブル ビューはそれを好まないようです。これを解決するには、tableHeaderView を searchBar (再び) に再設定して、オーバーラップの問題を修正するようにします。

最終的なコード:

- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar
{
    self.searchBar.showsScopeBar = YES;
    [self.searchBar sizeToFit];
    self.tableView.tableHeaderView = self.searchBar;
    return YES;
}
于 2012-03-14T00:47:17.140 に答える
4

UISearchBarController私自身もここ数日、この種の問題と戦ってきましUISearchDisplayControllerた.

UISearchBaraとメソッドを使用しUISearchBarDelegateて独自のメソッドを展開するだけで、すべてを設定して、思いどおりに動作させることができます。

ここで、最近のプロジェクトで私がしたことを示します。- スコープ バーは常に表示されたままです - テキストが入力されるとすぐにフィルタリングします - スコープが変更された場合はすぐにフィルタリングします - 不要な場合はキャンセル ボタンを非表示にします - 不要な場合はキーボードを非表示にします

// Filters the table when requested
- (void)filterContentForSearchBar:(UISearchBar *)searchBar
{
    NSString *scope = [[searchBar scopeButtonTitles] objectAtIndex:[searchBar selectedScopeButtonIndex]];
    NSString *search = [searchBar text];

    NSMutableArray *predicates = [[NSMutableArray alloc] init];

    if ([scope isEqualToString:@"Selected"])
    {
        [predicates addObject:[NSPredicate predicateWithFormat:@"selected == 1"]];
    }

    if (search && search.length) {
        [predicates addObject:[NSPredicate predicateWithFormat:@"name contains[cd] %@", search]];
    }

    NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicates];

    self.filteredObjectList = [self.objectList filteredArrayUsingPredicate:predicate];

    [self.myTableView reloadData];
}


#pragma mark - UISearchBarDelegate Methods

// React to any delegate method we are interested in and change whatever needs changing
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
    searchBar.showsCancelButton = true;
}

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
{
    searchBar.showsCancelButton = false;
    [searchBar resignFirstResponder];

    searchBar.text = nil;
    [self filterContentForSearchBar:searchBar];
}

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    searchBar.showsCancelButton = false;
    [searchBar resignFirstResponder];
}

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

- (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope
{
    [self filterContentForSearchBar:searchBar];
}

よく働く :)

于 2012-10-23T04:07:27.530 に答える