UISearchBar в приложении для iPhone / iPad - PullRequest
0 голосов
/ 18 февраля 2011

У меня есть такие данные ... (Все данные поступают из файла .plist ...)

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)»

, но после фильтрации данных предположим, что я нажал Row (в данных), который отображается в 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 release];searchArray = nil;

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

Ответы [ 2 ]

0 голосов
/ 21 февраля 2011

Вот то, что я сделал, и он отлично работает со мной (проверил это).Я взял один 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];
}
}

, например, у меня есть массив из 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;

}

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

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

0 голосов
/ 18 февраля 2011

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

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

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

отобразитеинформация в этом currentEmp.

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

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

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

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

...