アプリの複数のビューから表示および使用できる単一の 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 で正常に表示されている間は、検索メカニズムが機能していません。検索テキスト ボックスに書き込むことはできますが、アクションはありません。キーボードからの「検索」ボタンも機能しません。