如何实现UITableView搜索功能

时间:2010-08-21 20:03:12

标签: iphone objective-c cocoa-touch uitableview

我的iPhone应用程序有一个UITable View,其中包含搜索功能。表中的值分组为A-Z的部分。每当用户点击表格中的特定单元格时,它就会加载一个详细视图控制器,该控制器提供该特定用户的所有值。现在我的问题是每当我搜索某个联系人并点击某个特定用户查看他的详细信息视图时,它总是返回一个以字母A开头的联系人。所以,我怀疑如何实现这个搜索功能。有没有办法得到我点击的联系人的名字..请检查此截图..例如,如果我搜索一些以字母“B”开头的联系人并点击该联系人,它会加载以字母开头的联系人的详细视图'一个'。我从数据库中获取所有值。你能帮帮我吗... alt text

这是代码:

我在这里写的代码是一个方法:

我从数据库获取所有联系人并分配给阵列联系人。然后我根据字母对所有联系人进行分组,并将所有内容分组到字典中,其中键为A-Z,值为以这些字母开头的联系人姓名。现在,当我搜索特定联系人时,当我搜索特定联系人(例如以字母Z开头的联系人)时,他的名字可以从搜索栏中的A,B或Z ...开始,在这种情况下,它会提供详细信息A的人我希望这个改变,这样每当我点击一个特定的联系人时,它应该加载它的细节。我无法弄明白该怎么做..

    contacts = [[db getContacts:@"Contacts"] componentsSeparatedByString:@","];
    [db cleanup];

    NSMutableArray *tempArray = [[NSMutableArray alloc] init];
    NSString *charString;
    for (int i=65; i<91; i++) {
        charString = [NSString stringWithFormat:@"%c",(char *)i];
        [tempArray addObject:charString];
    }
    [charString release];

    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];


    for (int i=0; i<[tempArray count]; i++) {
        NSMutableArray *contactsByIndex = [[[NSMutableArray alloc] init]autorelease];
        NSString *tempChar = [tempArray objectAtIndex:i];

        for (int j=0; j<[contacts count]-1; j++)
        {

            NSString *test = [contacts objectAtIndex:j];
            NSString *tempString = [test substringToIndex:1];

            if ([tempString isEqualToString:tempChar]) {
                [contactsByIndex addObject:[contacts objectAtIndex:j]];
            }


        }
        [dict setObject:contactsByIndex forKey:[tempArray objectAtIndex:i]];
    }
        self.contactNames = dict;

    NSArray *array = [[contactNames allKeys] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

    self.contactKeys = array;

    [dict release];
    [tempArray release];

    //---display the searchbar--- 
    self.tableView.tableHeaderView = searchBar; 
    searchBar.autocorrectionType = UITextAutocorrectionTypeYes;

    listOfContacts = [[NSMutableArray alloc] init]; 
    for (NSString *key in array)  
    {

        NSArray *contactsArray = [contactNames objectForKey:key]; 
        for (NSString *name in contactsArray) {
            [listOfContacts addObject:name];
        }
    }


   - (void) searchContactsTableView {

    //---clears the search result--- 
    [searchResult removeAllObjects];
    for (NSString *str in listOfContacts) {
        NSRange titleResultsRange = [str rangeOfString:searchBar.text options:NSCaseInsensitiveSearch];
        if (titleResultsRange.length > 0) 
            [searchResult addObject:str];

    }

}



- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Navigation logic may go here. Create and push another view controller.
    NSString *selectedRow=nil;
    if (isSearchOn) {
        selectedRow=[searchResult objectAtIndex:indexPath.row];
    }

    DetailViewController *detailViewController;
    int section_index=[indexPath indexAtPosition:[indexPath length]-2];
    int sugarid_Index = [indexPath indexAtPosition: [indexPath length]-1];
    NSString* sectionName=[contactKeys objectAtIndex:section_index];
    NSLog(@"%@",sectionName);

//This is a method which gets the details of a particular contact based on the section and the row selected..Contacts is the table name

    NSString *getContact=[db getId:@"Contacts" bySection:sectionName andIndex:sugarid_Index];
    id=[db getContact:@"Contacts" id:getContact];
    // Pass the selected object to the new view controller.
    detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
    detailViewController.eachContact=contactForSugarId;
    [self.navigationController pushViewController:detailViewController animated:YES];

}

当我搜索联系人时,它应该在数据库中搜索名称并返回其详细信息。有没有办法做到这一点..请让我知道或有一种方法来获取单元格的名称,即联系人名称,以便我可以在我的一个数据库方法中使用它来检索我选择的联系人的详细信息

1 个答案:

答案 0 :(得分:0)

在搜索之后,听起来好像你正在查找错误的联系人数组。你需要有两个数组。一个包含所有联系人,另一个包含已过滤的联系人。搜索时,将所有结果按顺序放入已过滤的列表中,然后从该列表中提取详细信息。

这有意义吗?

如果没有,请尝试发布一些代码并解释您的结构。