2012-04-22 12 views
0

NSString要素が複数ある配列があり、検索バーがあるビューもあります。ユーザーが検索フィールドに何を書き込むかを検索したい各NSString要素の部分文字列。 NSString要素に部分文字列が含まれている場合は、新しい配列に追加します。私はコードでこれをやろうとしましたが、問題なく動作しますが、オブジェクトを追加しています。私はすでにデリゲートを自己に設定しています。NSString検索バーで部分文字列を検索する定数

//.h @interfaceクラス1

@property(strong, nonatomic) NSMutableArray *allExercisesNames; 
@property (weak, nonatomic) IBOutlet UISearchBar *searchBar; 
@property(strong, nonatomic) NSMutableArray *foo; 

@end 

//.m

@implementation class1 

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{  
for(int i = 0; i < _allExercisesNames.count;i++) 
{ 
    if([[_allExercisesNames objectAtIndex:i] rangeOfString:searchBar.text].location != NSNotFound) 
    { 
     if(_foo == nil) 
     { 
      _foo = [[NSMutableArray alloc]initWithObjects:[_allExercisesNames objectAtIndex:i], nil]; 
      [self.gridView reloadData]; 

     } 
     else 
     { 
      [_foo addObject:[_allExercisesNames objectAtIndex:i]]; 
      [self.gridView reloadData]; 
     } 
    } 

} 

if([searchBar.text isEqualToString:@""] || searchBar.text==nil) 
    //![_allExercisesNames containsObject:searchBar.text 
{ 
    _foo = nil; 
    [self.gridView reloadData]; 
} 
} 
+0

メソッドが呼び出されていますか?メソッドでブレークポイントを設定しようとしましたが、何が起こったのか見てきましたか? –

+0

はい、関数が呼び出されます、私はそれが並べ替えることがわかりますが、その後、foo配列に追加を続けるので、ビューの中のいくつかの要素を参照してください –

答えて

1

あなたは、関数の先頭に_FOOする 'ゼロ' を割り当てていないので、追加し続けて何かを入力するたびに古い_foo配列に移動します。

代わりに_fooを関数の先頭の新しい配列に設定する必要があります。そのため、_allExercisesNames配列をスキャンする前にクリアされます。

ここでは簡略化された固定されたバージョンで 'for(x in y)'を使用してより簡潔にしています。

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    if([searchBar.text isEqualToString:@""] || searchBar.text==nil) 
     _foo = nil; 
    else 
    { 
     _foo = [NSMutableArray new]; 
     for(NSString *exercise in _allExercisesNames) 
      if([exercise rangeOfString:searchBar.text].location != NSNotFound) 
       [_foo addObject:exercise]; 
    } 

    [self.gridView reloadData]; 
} 
+0

それは完璧に働いた、ありがとう:) –

+0

起こる。配列の中のどの要素も範囲を持たない部分文字列を検索すると、配列内のすべての要素が再び表示されるとしましょう。どのようにそれを防ぐためにどのようなアイデア?配列から要素を表示しないだけです。 –