1

我制作了一个具有不同搜索组合的应用程序。

该应用程序有 6 个文本字段可用于输入和搜索文本。每个文本字段都用于另一个搜索条件。

搜索前只需填写 1 个文本字段。除此之外,用户可以选择要填写和搜索多少个文本字段。所以可能有多种搜索组合。

问题是,确定填写哪些文本字段以及如何搜索满足搜索条件的对象的最佳方法是什么。

搜索方法应该遍历一个对象数组(在我的例子中是一个员工对象数组)并检查值是否匹配。

我的目标是限制 if 语句的数量。

更新:

到目前为止,这是我的代码:

-(IBAction)SearchEmployees:(id)sender{

NSString *fullName = [(textfieldName.text)uppercaseString];
NSString *functionName = [(textfieldFunction.text)uppercaseString];
NSString *department = [(textfieldDepartment.text)uppercaseString];
NSString *field = [(textfieldField.text)uppercaseString];
NSString *expertise = [(textfieldExpertise.text)uppercaseString];
NSString *interest = [(textfieldInterest.text)uppercaseString];

NSMutableDictionary *filledTextfields = [NSMutableDictionary dictionary];

if (![fullName isEqualToString:@""]){
    [filledTextfields setObject: fullName  forKey: @"fullName"];
}

if (![functionName isEqualToString:@""]){
    [filledTextfields setObject: functionName  forKey: @"functionName"];
}

if (![department isEqualToString:@""]){
    [filledTextfields setObject: department  forKey: @"department"];
}

if (![field isEqualToString:@""]){
    [filledTextfields setObject: field  forKey: @"field"];
}

if (![expertise isEqualToString:@""]){
    [filledTextfields setObject: expertise  forKey: @"expertise"];
}

if (![interest isEqualToString:@""]){
    [filledTextfields setObject: interest forKey: @"interest"];
}


NSMutableArray *foundEmployee = [[NSMutableArray alloc]init];

 for (id key in filledTextfields)
 {
     NSLog(@"KEY: %@ OBJECT: %@", key, [filledTextfields objectForKey:key]);

     for (Employee *employee in self.employees){    //self.employees is the array to search in
         //do something
     }

 }
4

2 回答 2

2

我会使用 NSMutableDictionary,将数组的内容添加到字典中,并使用适当的搜索词作为字典的键,然后当您搜索某些内容时,您可以从文本字段中获取文本,然后执行[dictionary objectForKey:textfieldText]它将返回适当的对象,如果没有该搜索词的对象,则返回 nil。

我不确定您的搜索条件是如何工作的,但这可能会奏效。

于 2013-02-08T10:17:14.693 回答
1

我会构建一个“复合谓词”来过滤数组:

NSMutableArray *predicates = [NSMutableArray array];
if ([textFieldName.text length] > 0) {
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"fullName =[c] %@", textFieldName.text];
    [predicates addObject:pred];
}
if ([textfieldFunction.text length] > 0) {
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"functionName =[c] %@", textfieldFunction.text];
    [predicates addObject:pred];
}
// ... same procedure for remaining search criteria ...

if ([predicates count] > 0) { // At least one search criterion
    NSPredicate *finalPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicates];
    NSArray *foundEmployees = [self.employees filteredArrayUsingPredicate:finalPredicate];
}

=[c]进行不区分大小写的比较。如果合适,您也可以使用BEGINSWITH[c]或。CONTAINS[c]

谓词使用键值编码,因此fullNamefunctionName应该是员工对象的属性。

于 2013-02-08T14:24:52.520 回答