6

ストーリーボードのxcodeでテーブルのsearchBarを作成したいのですが、すべてうまくいき、エラーはありません。検索だけが機能しません。

この 2 つのチュートリアルを見ましたが、まだ機能しません。検索できません。私のチュートリアル:

   -http://stackoverflow.com/questions/9897171/uisearchbar-implemented-with-storyboards
   -http://www.youtube.com/watch?v=IqDZHgI_s24

よろしくお願いします。

これが私のコードです

CreateViewController.h

#import <UIKit/UIKit.h>

@interface CreateViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource,       UISearchBarDelegate>
{
// @property (weak, nonatomic) IBOutlet UISearchBar *searchBar;
NSArray *datas;
NSMutableArray *displayItems;
IBOutlet UITableView * tableView;
IBOutlet UISearchBar * searchbar;
}

@end

CreateViewController.m

#import "CreateViewController.h"

@interface CreateViewController ()

@end

@implementation CreateViewController

- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:style];
if (self) {
    // Custom initialization
}
return self;
}

- (void)viewDidLoad
{
[super viewDidLoad];

datas = [NSMutableArray arrayWithObjects:@"Johan", @"Paul",@"George",@"Ringo", nil];
displayItems = [[NSMutableArray alloc] initWithArray:datas];
[super viewDidLoad];
}

- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return [datas count];
}

- (UITableViewCell *)tableView:(UITableView *)atableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";//This is the identifier in storyboard    
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(!cell) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
}

cell.textLabel.text = [datas objectAtIndex:indexPath.row];
return cell;
}
-(void)searchbar:(UISearchBar *)searchbar textDidChange:(NSString *)searchText{
if([searchText length] == 0){
    [displayItems removeAllObjects];
    [displayItems addObjectsFromArray:datas];
}else{
    [displayItems removeAllObjects];
    for(NSString * string in datas){
        NSRange r = [string rangeOfString:searchText options:NSCaseInsensitiveSearch];
        if (r.location != NSNotFound){
            [displayItems addObject:string];   
        }
    }
}
[tableView reloadData];
}

 #pragma mark - Table view delegate

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
 {
// Navigation logic may go here. Create and push another view controller.
/*
 <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib    name#>" bundle:nil];
 // ...
 // Pass the selected object to the new view controller.
 [self.navigationController pushViewController:detailViewController animated:YES];
 */
}

@end
4

5 に答える 5

8

このチュートリアル iOS クイック ヒント: 検索バーで UITableView をフィルタリングするを使用してください。

http://code-ninja.org/blog/2012/01/08/ios-quick-tip-filtering-a-uitableview-with-a-search-bar/

-(void)searchBar:(UISearchBar*)searchBar textDidChange:(NSString*)text
{
if(text.length == 0)
{
    isFiltered = FALSE;
}
else
{
    isFiltered = true;
    filteredTableData = [[NSMutableArray alloc] init];

    for (Food* food in allTableData)
    {
        NSRange nameRange = [food.name rangeOfString:text options:NSCaseInsensitiveSearch];
        NSRange descriptionRange = [food.description rangeOfString:text options:NSCaseInsensitiveSearch];
        if(nameRange.location != NSNotFound || descriptionRange.location != NSNotFound)
        {
            [filteredTableData addObject:food];
        }
    }
}

[self.tableView reloadData];
}
于 2012-05-06T20:45:43.560 に答える
1

この関数に NSPredicate を使用できます。以下のように検索デリゲート メソッドを変更します。

    [datas release];
datas = nil;

datas = [[NSMutableArray alloc] initWithArray: displayItems];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF like[c] %@",[NSString stringWithFormat:@"%@*",searchBar.text]];
[datas filterUsingPredicate:predicate];
[tableView reloadData];

サンプルコードはこちら

http://dl.dropbox.com/u/58723521/SearchSample.zip

于 2012-04-26T10:14:33.897 に答える
1

データ配列ではなく配列を使用するようcellForRowAtIndexPathに変更する必要があることに同意します。検索バーにが設定されているかどうかも確認してください。numberOfRowsInSectiondisplayItemsUISearchBarDelegate

于 2012-04-26T10:19:55.930 に答える
0

data 配列ではなく displayItems 配列を使用するように cellForRowAtIndexPath を変更する必要があります

- (UITableViewCell *)tableView:(UITableView *)atableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";//This is the identifier in storyboard    
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(!cell) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];

}

cell.textLabel.text = [displayItems objectAtIndex:indexPath.row];
return cell;
}

また、numberOfRowsInSection を変更して、displayItems 配列カウントを使用します

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{

// Return the number of rows in the section.
return [displayItems count];
}
于 2012-04-26T09:39:03.460 に答える
0

こうやって、

  • ヘッダー ファイルで、次のように配列を宣言します。

    NSMutableArray *datas;
    NSMutableArray *displayItems;
    
  • 次に、 viewDidLoadで配列の初期化を次のように変更します。

    datas = [[NSMutableArray alloc] initWithObjects:@"Johan", @"Paul",@"George",@"Ringo", nil];
    displayItems = [[NSMutableArray alloc] initWithArray:datas];
    
  • cellForRowAtメソッドで配列を変更し、

    cell.textLabel.text = [displayItems objectAtIndex:indexPath.row];
    
  • 次に、 NSLog を使用してtextDidChangeメソッド内に検索文字列を出力します。印刷されない場合は、IBOutlet 接続に問題があります。印刷された場合は、このメソッドを置き換えて、機能するかどうかを確認してください。

    -(void)searchbar:(UISearchBar *)searchbar textDidChange:(NSString *)searchText{
    
    if([searchText length] == 0){
    
    }else{
        [displayItems removeAllObjects];
        for (int i=0; i<[datas count]; i++) {
            if ([searchText hasPrefix:[datas objectAtIndex:i]]) {
                [displayItems addObject:[datas objectAtIndex:i]];
            } else {
    
            }
        }
    }
    [tableView reloadData];
    }
    

私の選別方法は、世界一ではありません。ただし、コードを機能させるようにしてください。

編集:あなたのデリゲートは発火しないと思います。上記の代わりにこの方法を試してください。

- (void) searchBarSearchButtonClicked:(UISearchBar*) theSearchBar
{
if([searchBar.text length] == 0){
arrayDisplayData = arrayOriginalData;
}else{
    [arrayDisplayData removeAllObjects];
    for(NSString * string in arrayOriginalData){
        NSRange r = [string rangeOfString:searchBar.text options:NSCaseInsensitiveSearch];
        if (r.location != NSNotFound){
            [arrayDisplayData addObject:string];   
        }
    }
}
[tblResults reloadData];
}

またはこれ、

- (BOOL)searchBar:(UISearchBar *)searchBar shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
于 2012-04-26T08:51:44.670 に答える