0

いくつかのNSString要素を含む配列があり、検索バーがあるビューもあります。ユーザーが検索フィールドに各NSString要素のサブストリングとして書き込んだ内容の検索を開始したいと思います。NSString要素に部分文字列が含まれている場合は、それを新しい配列に追加します。私はコードでこれをやろうとしました、そしてそれはうまくいきます、しかしそれはオブジェクトを追加し続けます、それはすでにそれらのためにあります、それで誰かがなぜ何か考えを持っていますか?私はすでに代理人を自分自身に設定しました。

//.h @interface class1

@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];
}
} 
4

1 に答える 1

1

関数の先頭で_fooに'nil'を割り当てていないため、何かを入力するたびに古い_foo配列に追加され続けます。

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

これは、より簡潔にするために「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];
}
于 2012-04-22T17:30:16.393 に答える