как добавить панель поиска в uitableview? - PullRequest
12 голосов
/ 04 апреля 2011

У меня NSMutableArray отображается в UITableView, и я добавил туда несколько элементов.

Например, имена элементов: First, FirstTwo, Second, SecondTwo, Third, ThirdTwo.

Теперь я хочу добавить панель поиска на экране.В этой строке поиска, когда я набираю F, в таблице должны отображаться только First и FirstTwo.

Как мне это сделать?

Ответы [ 4 ]

27 голосов
/ 08 ноября 2012
 searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];

 searchBar.delegate = self;

 self.tableView.tableHeaderView = searchBar;
17 голосов
/ 04 апреля 2011

Лучший способ освоить это - следовать учебнику здесь здесь . Часть, которую вы ищете, это:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
   [tableData removeAllObjects];// remove all data that belongs to previous search
   if([searchText isEqualToString:@""]searchText==nil){
      [myTableView reloadData];
      return;
   }

   NSInteger counter = 0;
   for(NSString *name in dataSource)
   {
      NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
      NSRange r = [name rangeOfString:searchText];
      if(r.location != NSNotFound)
      {
         if(r.location== 0)//that is we are checking only the start of the names.
         {
            [tableData addObject:name];
         }
      }

      counter++;
      [pool release];

   }

   [myTableView reloadData];
}
1 голос
/ 16 июня 2016

Если вы используете панель поиска. Затем Вы можете выполнить поиск по вашему содержанию таблицы, используя метод делегата панели поиска

(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
// myArray is main array for Table View
// tempMainArray which store myArray Data

myArray = [[NSMutableArray alloc]initWithArray:tempMainArray];
NSMutableArray *searchArray = [[NSMutableArray alloc]init];


[searchArray removeAllObjects];// remove all data that belongs to previous search
if([searchText isEqualToString:@""]|| searchText==nil){

    [myArray removeAllObjects];
    myArray =  tempMainArray;
    [_objTableView reloadData];

    return;
}

NSInteger counter = 0;
for(NSString *name in myArray)
{

    NSRange r = [name rangeOfString:searchText];
    if(r.location != NSNotFound)
    {
        if(r.location== 0)//that is we are checking only the start of the names dynamicaly.
        {
            [searchArray addObject:name];
        }
    }

    counter++;


}

if (searchArray.count > 0) {

    [myArray removeAllObjects];
     myArray =  searchArray;
    [_objTableView reloadData];
}
else
{
    [myArray removeAllObjects];
    myArray =  tempMainArray;
    [_objTableView reloadData];
}

}
0 голосов
/ 08 сентября 2015

Я сделал это сам, и он работает абсолютно нормально.

Объявите два изменяемых массива.Один содержит все данные, а второй - для хранения отфильтрованных данных.Здесь searchuser - это поисковая панель на выходе.aray - это основной массив, хранящий все данные.установите свойство заглавной буквы в строке поиска, чтобы оно работало правильно.

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    [searchuser.text lowercaseString]);
    filteredarray=[[NSMutableArray alloc]init];
    int l=(int)[searchuser.text length];
    if (l>0)
    {
        NSMutableString * data=[[NSMutableString alloc]init];
        int a=(int)[aray count];

        for (int i=0;i<=a-1;i++)
        {
            data=[aray objectAtIndex:i];
            if ([searchuser.text isEqualToString:data])
            {
                [filteredarray addObject:data];
            }
            if ([data length]>l)
            {
                NSMutableString * string=[[NSMutableString alloc]initWithString:[data substringWithRange:NSMakeRange(0, l)]];

                if ([searchuser.text isEqualToString:string])
                {
                    [filteredarray addObject:data];

                }
            }
        }
    }
    else
    {
        filteredarray=aray;
    }
    [tableview reloadData];
}
...