0

嗨,我是 iphone 应用程序开发的新手,但这个问题更多的是与编码相关。我使用 tableview 来显示用户名(textLabel)和 phoneNumbers(detailtextLabel)当然使用地址簿。我将它们都存储在单独的数组中。另外,我有一个电子邮件地址存储在一个单独的数组中。并使用所有这些,我成功地能够在创建的表格视图中按排序顺序显示联系人。问题出在 searchDisplayController 的实现中。在这里,我希望能够按用户名和电子邮件 ID(两者之一)进行搜索。

因此,我使用 NSDictionary 将姓名+电子邮件存储为值(NSString 格式),其中键作为显示该联系人的行的索引。现在,我使用以下代码成功获取了所有匹配联系人的数组。

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope{

NSPredicate *resultPredicate = [NSPredicate
                                predicateWithFormat:@"SELF contains[cd] %@",
                                searchText];

searchResults  = nil;
matchingContacts = nil;
NSArray *allContactValues = [allContactNamesWithEmailIDs allValues];
searchResults = (__bridge CFArrayRef)([[allContactValues sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)] filteredArrayUsingPredicate:resultPredicate]);
matchingContacts  = [[NSMutableArray alloc] initWithArray:(__bridge NSMutableArray*)searchResults];

匹配联系人返回所有匹配联系人姓名的数组。但是,当有两个用户具有相同的名称(相同的值 bt 不同的键)时,使用它有一个缺点,我无法将其追溯到不同的键。它会显示相同的名称和相同的电话号码两次,这将是一个问题。

创建单元格的代码如下:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{     static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

}
    if(tableView == self.searchDisplayController.searchResultsTableView){

        if (farmMarkets.count>0) {
            destIndex = [[[allContactNamesWithEmailID allValues] sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)] indexOfObject:matchingContacts[indexPath.row]];  //?? I believe this is what needs to be modified to display multiple contacts. Just don't know how.

            [cell.textLabel setText:farmMarkets[destIndex]];

            if (destIndex<0) {
                [cell.detailTextLabel setText:@""];
            }
            else{
                [cell.detailTextLabel setText:phoneNumbersArray[destIndex]];
            }

        }
    }

}

有人可以给我一个代码示例,解释如何更好地实现吗?所有的想法都会有所帮助。我现在将总结一下。我想实现一个 tableView,显示带有姓名和电话号码的联系人以及顶部的搜索栏。当我使用姓名或电子邮件 ID 进行搜索时,它应该显示带有相应电话号码的姓名。

4

1 回答 1

0

根据您的描述,您有很多不同的数据存储方法,而您的问题来自试图在不同时间将它们关联在一起。

我会简化您的结构,以便您拥有一个包含字典的源信息数组。每个字典都包含一个人的所有数据。

现在,您可以根据需要和字典中的任何(组合)键对该数组进行排序。此外,当您过滤时,您过滤数组(或者,更好的是,它的副本,以便您仍然拥有原始数组),以便保持顺序并且您不需要与其他任何内容相关联。

于 2013-08-23T11:57:23.647 回答