0

我有这样的数据......(所有数据都来自 .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(Key)”搜索数据

但是在过滤数据之后假设我点击了显示在 TableView 中的行(在数据中)。它使用该特定员工的所有信息(例如:FirstName、LastName、EmpCode)将我导航到 New-Controller。

我怎样才能得到信息?

当我浏览搜索示例代码时。

这是我的搜索代码...

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 中的所有“Keys(FirstName,LastName,EmpCode)”请帮帮我?谢谢...

4

2 回答 2

0

我认为最好的方法是制作一个数组,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 变量跟踪这一点,即过滤是否处于活动状态。

于 2011-02-18T14:15:49.870 回答
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];
}
}

例如,我有一个包含 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 处理,所以可以访问过滤后的数组,你需要向它传递一个保留消息。

于 2011-02-21T06:26:40.033 回答