2011-02-18 1 views
0

У меня есть данные, как это ... (Все данные поступают из файла .plist ...)UISearchBar в iPhone/IPad приложения

Searching Array - (
      { 
      FirstName = "Ramesh"; 
      LastName = "Bean"; 
      EmpCode = 1001; 
     }, 
      { 
      FirstName = "Rohan"; 
      LastName = "Rathor"; 
      EmpCode = 102; 
     }, 
      { 
      FirstName = "Priya"; 
      LastName = "Malhotra"; 
      EmpCode = 103; 
     }, 
      { 
      FirstName = "Mukesh"; 
      LastName = "Sen"; 
      EmpCode = 104; 
     }, 
      { 
      FirstName = "Priya"; 
      LastName = "Datta"; 
      EmpCode = 105; 
     } 

    ) 

Я хочу осуществить поиск данных из этого массива на основе FirstName (ключ).

Я могу искать данные с «FirstName (Key)»

но после фильтрации данных предположим, я нажал строку (в данных), который отображается в TableView. Он переводит меня в New-Controller со всей информацией этого конкретного сотрудника (например: FirstName, LastName, EmpCode).

Как я могу получить информацию?

Как я прошел через образцы кода поиска.

Вот мой код поиска ...

NSString *searchText = searchBar.text; 
    NSMutableArray *searchArray = [[NSMutableArray alloc] init]; 
    NSInteger TotalNoOfRecords=[self.SearchtableDataSource count]; 

    for (int i=0;i<TotalNoOfRecords;i++) 
    { NSDictionary *dictionary = [self.SearchtableDataSource objectAtIndex:i]; 
     NSArray *array = [dictionary objectForKey:@"FirstName"]; 


     [searchArray addObject:array]; 


    } 
    for (NSString *sTemp in searchArray) 
    { 

     NSRange titleResultsRange = [sTemp rangeOfString:searchText options:NSCaseInsensitiveSearch]; 

     if (titleResultsRange.length > 0) 
     { 
       [copyListOfItems addObject:sTemp]; 

     } 
    } 

Как можно улучшить этот код .... Пожалуйста, наставит меня ... [searchArray релиз]; searchArray = nil;

Как мы поддерживаем все «Ключи (FirstName, LastName, EmpCode)» в searchArray, пожалуйста, помогите мне? Спасибо ...

+0

NSPredicate * predicate = [NSPredicate predicateWithFormat: @ "FirstName like [cd]% @", searchText]; NSArray * filterArray = [self.SearchtableDataSource filterArrayUsingPredicate: предикат]; Это полезно для меня, но все же я не получаю данные после поиска. Пожалуйста, помогите мне с некоторым примером кода. Спасибо. – user532445

ответ

0

Я думаю, что лучший подход должен был бы сделать массив NSDictionary, который имеет значение для трех клавиш, а именно «FirstName», «LastName», «EmpCode»

прямо сейчас для фильтрации данных в соответствии с "FirstName" использовать NSPredicate вместо того, чтобы цикл,

NSString *searchText = searchBar.text; 

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"FirstName like[cd] %@",searchText]; 
NSArray* filteredArray = [self.SearchtableDataSource filteredArrayUsingPredicate:predicate]; 

в методе cellForRowAtIndexPath

NSDictionary* currentEmp = [filteredArray objectAtIndex:inddexPath.row]; 

отображает информацию в этом текущем поле.

Аналогична в didSelectRowAtIndexPath

NSDictionary* currentEmp = [filteredArray objectAtIndex:inddexPath.row]; 

и передать этот словарь в следующем ViewController, в которой и нужна Dispaly детали текущей службы.

если и есть две точки зрения таблица одна, что из searchDisplayController (показывающий отфильтрованный результат) и тот, который показывает весь результат, то и может отслеживать это, имеющий переменную TACKING BOOL, которое, если фильтрация включена или нет.

+0

Hi Amit .. Благодарим вас ... ответ. Я попробую этот подход. Я думаю, это поможет мне решить проблему. Нет, у меня есть только один UITabbleView. Я был бы признателен, если бы вы могли дать мне фиктивный пример. Спасибо. – user532445

+0

Hey Amit, пожалуйста, предоставьте мне несколько советов по этому вопросу. Я очень новый разработчик в программировании iPhone-Objective-c. Спасибо. – user532445

+0

NSPredicate * predicate = [NSPredicate predicateWithFormat: @ "FirstName like [cd]% @", searchText ]; NSArray * filterArray = [self.SearchtableDataSource filterArrayUsingPredicate: предикат]; Это полезно для меня, но все же я не получаю данные после поиска. Пожалуйста, помогите мне с некоторым примером кода. Спасибо. – user532445

0

Вот что я сделал, и он отлично работает со мной (протестировал его). Я взял один из IBOutlet UISearchBar так вот код для ур .h файла

@interface SearchForEmp : UIViewController<'UISearchDisplayDelegate,UISearchBarDelegate,UITableViewDelegate,UITableViewDataSource> { 

IBOutlet UISearchBar* mySearchBar; 
UISearchDisplayController* mySearchDisplayController; 

NSMutableArray* allEmp; 
NSMutableArray* filteredEmp; 
BOOL isFilatering; 
} 
@end 

Теперь в .m файл

-(void)viewDidLoad 
{ 
[super viewDidLoad]; 

mySearchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:mySearchBar contentsController:self]; 
mySearchDisplayController.searchResultsDelegate = self; 
mySearchDisplayController.searchResultsDataSource = self; 
mySearchDisplayController.delegate = self; 

isFilatering = NO; 
filteredEmp = [[NSMutableArray alloc] init]; 
allEmp = [[NSMutableArray alloc] init]; 
NSDictionary *temp; 
for (int i = 0; i < 30; i++) { 
    temp = [NSDictionary dictionaryWithObjectsAndKeys:[NSString stringWithFormat:@"FirstName_%d",i],@"FirstName",[NSString stringWithFormat:@"LastName_%d",i],@"LastName",[NSNumber numberWithInt:1000+i],@"EmpCode",nil]; 
    [allEmp addObject:temp]; 
} 
} 

, например, для целей у меня есть thake массив из 30 словарей, каждый из которых уникальное имя. Для источника данных таблицы и делегата .....

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 

{ 

return 1; 
} 


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

{ 

if (isFilatering) { 
    return [filteredEmp count]; 
} 
else { 
    return [allEmp count]; 
} 
return [allEmp count]; 

} 




-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

{ 

static NSString *CellIdentifier = @"Cell"; 

UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) 
{ 
    cell = [[[UITableViewCell alloc] init] autorelease]; 
} 

NSDictionary* temp; 
if (isFilatering) { 
    temp = [filteredEmp objectAtIndex:indexPath.row]; 
} 
else { 
    temp = [allEmp objectAtIndex:indexPath.row]; 
} 
cell.textLabel.text = [NSString stringWithFormat:@"%@ %@",[temp objectForKey:@"FirstName"],[temp objectForKey:@"LastName"]]; 
return cell; 
} 

Теперь, что касается поиска обеспокоен здесь то, что и нужно сделать .......

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 

{ 

NSPredicate* predicate = [[NSPredicate predicateWithFormat:@"self.FirstName contains %@",mySearchBar.text] retain]; 
filteredEmp = [[allEmp filteredArrayUsingPredicate:predicate] retain]; 

} 

-(void) searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller 

{ 

isFilatering = YES; 

} 

-(void) searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller 

{ 

isFilatering = NO; 

} 

Я надеюсь, что поможет вам понять вещи, не забудьте добавить сохранить в линия filteredEmp = [[allEmp filteredArrayUsingPredicate:predicate] retain];

потому, что метод filteredArrayUsingPredicate: является методом аксессора и его сохраняет отсчет обрабатываются NSArray поэтому имеет доступ к отфильтрованному массиву и нужно передать сохранить Сообща к нему.

+0

этот код не показывает результат ур не ищет ....... если вы хотите, чтобы просто добавить tableView в розетку и связать свой источник данных и делегировать с владельцем файлов покажет все данные, потому что здесь написан код для того же. –

+0

Hi Amit .... Ваш предыдущий пост работает отлично для меня .. с небольшим изменением в этой строке. NSPredicate * predicate = [NSPredicate predicateWithFormat: @ "Название CONTAINS [cd]% @", searchText]; Ваше новое сообщение тоже приятно, я тоже попробую. Большое спасибо ... – user532445

+1

отредактировал ваш код для форматирования. – thesummersign