1

アプリの複数のビューから表示および使用できる単一の UISearchBar を作成したいと考えています。

このため、AppDelegate クラスで UISearchBar プロパティを宣言し、最初の UIViewController で初期化しました。

@interface AppDelegate : UIResponder <UIApplicationDelegate>{

    IBOutlet UIWindow *window;

}

@property (strong, nonatomic) IBOutlet UISearchBar *searchBar;

私の最初のビュー.h

@interface MainTableViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, UISearchDisplayDelegate, UISearchBarDelegate>{

    AppDelegate *appDelegate;
    NSArray *searchResults;
}

@property (strong, nonatomic) IBOutlet UIBarButtonItem *accountPage;
@property (strong, nonatomic) IBOutlet UIBarButtonItem *search;

私の最初のビュー.m

    - (void)viewDidLoad
    {
        [super viewDidLoad];

        appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

        self.search = [self.search initWithBarButtonSystemItem:UIBarButtonSystemItemSearch target:self action:@selector(showSearchBar:)];


    }

        - (IBAction)showSearchBar:(id)sender{

            UIBarButtonItem *searchItem = (UIBarButtonItem *) sender;

            if (searchItem.tag == 0) {
                if (!appDelegate.searchBar) {
                    appDelegate.searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0,0,320,44)];
                    [[UISearchDisplayController alloc] initWithSearchBar:appDelegate.searchBar contentsController:self];
                    self.searchDisplayController.searchResultsDelegate = self;
                    self.searchDisplayController.searchResultsDataSource = self;
                    self.searchDisplayController.delegate = self;
                    [self.view addSubview:appDelegate.searchBar];
                } else{
                    [appDelegate.searchBar setHidden:NO];
                }
                searchItem.tag = 1;
            } else{
                searchItem.tag = 0;
                [appDelegate.searchBar setHidden:YES];
            }
        }

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (tableView == self.searchDisplayController.searchResultsTableView) {
        return [searchResults count];

    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    if (tableView == self.searchDisplayController.searchResultsTableView) {
        cell.textLabel.text = [searchResults objectAtIndex:indexPath.row];
    } 
    // Set up the cell
    return cell;
}

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    NSLog(@"filterContentForSearchText");
    NSPredicate *resultPredicate = [NSPredicate
                                    predicateWithFormat:@"(name contains[cd] %@)",
                                    searchText];

    searchResults = [appDelegate.elements filteredArrayUsingPredicate:resultPredicate];
}

- (BOOL) searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{

    [self filterContentForSearchText:searchString
                               scope:[[appDelegate.searchBar scopeButtonTitles]
                                      objectAtIndex:[appDelegate.searchBar
                                                     selectedScopeButtonIndex]]];

    return YES;
}

ただし、検索バーが初期化され、VC で正常に表示されている間は、検索メカニズムが機能していません。検索テキスト ボックスに書き込むことはできますが、アクションはありません。キーボードからの「検索」ボタンも機能しません。

4

2 に答える 2

0

UISearchBarDelegate使用方法に応じて、それぞれのコントローラー クラスにメソッドを実装する必要があります。

これを参照してください

ドキュメンテーション UISearchBarDelegate

答えを拡張する:

「my first view .m」ファイルでは、アクションを取得するために UISearchBarDelegate メソッドを実装する必要があります。

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
{   
    return YES;
}

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    //This is where your search button action fires. You can implement what you want to do after search button click in here.   
}

-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
   //This fires whenever you change text in your search bar. For an example if you want to show search suggestions when a new letter is typed you can implement that in here.
}

要件に応じて、他のデリゲート メソッドを使用できます。

于 2013-06-04T11:29:57.070 に答える
-1

XIB で Search Bar と Search Display Controller オブジェクトを使用します。このオブジェクトを XIB にドラッグ アンド ドロップするだけです。

テーブル ビュー デリゲートとデータ ソース メソッドを実装します。

お気に入り

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    if(tableView == self.aTableView)
    return [self.categories count];//normal table view
    return [self.searchCategories count];//search display controllers TableView
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    static NSString *identifier = @"reusableCells";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if(cell == nil)
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault     reuseIdentifier:identifier] autorelease];
    NSString *text = nil;
    if(tableView == self.aTableView)
        text = [self.categories objectAtIndex:indexPath.row];
    else
       text = [self.searchCategories objectAtIndex:indexPath.row];

    cell.textLabel.text = text;

    return cell;
}

ディスプレイ コントローラ メソッドの検索

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{
    if(self.searchCategories == nil){
        NSMutableArray *arr = [[NSMutableArray alloc] init];
        self.searchCategories = arr;
        [arr release];
    }else{
        [self.searchCategories removeAllObjects];
    }

    for (NSString *aStr in self.categories) {
        if([[aStr lowercaseString] rangeOfString:[searchString lowercaseString]].location != NSNotFound){
           [self.searchCategories addObject:aStr];
        }
    }
    [controller.searchResultsTableView reloadData];
    return NO;
}



- (void) searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller{
    [self.aTableView setHidden:YES];
}
- (void) searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller{
    [self.aTableView setHidden:NO];
}

これがあなたを助けることを願っています。それでも問題がある場合は、詳細を読むことをお勧めします

UISearchDisplayController
于 2013-06-04T12:29:55.327 に答える