在NSString搜索栏中不断搜索子字符串

时间:2012-04-22 17:13:41

标签: objective-c ios xcode search

我有一个包含多个NSString元素的数组,我也有一个视图,我有一个搜索栏。我想开始搜索用户在搜索字段中写入的内容,作为每个NSString元素的子字符串。如果NSString元素包含子字符串,我想将其添加到新数组。我试图用代码做到这一点,它工作正常,但它不断添加对象,即使它已经为他们,所以有谁有任何想法为什么?我已经将代表设置为自己。

//的.h     @interface class1

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

@end

//。米

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

1 个答案:

答案 0 :(得分:1)

您没有在函数顶部为_foo指定'nil',因此每次输入内容时它都会继续添加到旧的_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];
}