IOS Searchbar返回错误的数据

时间:2014-09-25 02:17:29

标签: ios objective-c tableview searchbar

我疯狂地试图让我的IOS Searchbar为Iphone工作。我从远程服务器访问数据并填充内容文件。然后我做一个过滤器,创建一个过滤的内容文件。然后我做了一个[self.tableView reloadData()]。它第一次工作正常。然后我改变我的范围并从我的服务器再次获取数据并过滤它并再次重新加载。但是,第二次表格显示前一个显示的前9个项目而不是过滤后的文件中的新9个项目。我控制台显示过滤文件中的文件计数,在本例中为tableView numberOfRowsInSection中的9:我还显示通过cellForRowAtIndexPath的每个项目。在cellForRowAtIndexPath中,我显示了正确的9个未过滤的项目,但它们没有出现在桌面上!该表显示了旧显示屏中的前9个项目。

我的问题是,即使计数正确,桌面上的新数据也不会显示旧数据吗?为什么我在控制台上显示正确的项目,但显示屏显示旧显示屏中的项目。我需要做什么才能显示新数据?我知道这很难理解,但我列出了下面的一些代码,希望有人能给我一些关于为什么表格视图没有用最新数据更新的线索。

     //  This is where I get data back from the server.

     self.listContent = [[NSArray alloc] init];

     if(_scopeIndex == 0)
         self.listContent = [jsonObject objectForKey:@"burials"];
     else
         if(_scopeIndex == 1)
             self.listContent = [jsonObject objectForKey:@"obits"];
         else
             self.listContent = [jsonObject objectForKey:@"photos"];

     if(self.listContent > 0)
     {
     dispatch_async(dispatch_get_main_queue(), ^{

          [self filterContentForSearchText:searchString scope:
          [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
         [self.tableView reloadData];
     });
     }

以下是过滤数据的位置。在这种情况下,未过滤和过滤的文件是相同的。

        - (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope{
/*
 Update the filtered array based on the search text and scope.
 */

[self.filteredListContent removeAllObjects];// First clear the filtered array.

/*
 Search the listContent for names that match and add to the filtered array.
 */

for (int i = 0; i < [self.listContent count]; i++)
{

        NSComparisonResult result = [self.listContent[i][@"LastName"] compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])];
        if (result == NSOrderedSame)
        {
            [self.filteredListContent addObject:self.listContent[i]];
        }
//  }
}

}

这是我获取过滤项目的表数的地方。

       - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
if (tableView == self.searchDisplayController.searchResultsTableView)
{
    NSLog(@"Filtered Name count = %i", [self.listContent count]);
    return [self.filteredListContent count];
}
else
{
    NSLog(@"Name count = %i", [self.listContent count]);
    return [self.listContent count];
}

}

这是我更新表格中的单元格的地方:

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

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellID];
if (cell == nil)
{

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellID];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}   

if(indexPath.row > [self.filteredListContent count] - 1)
    return cell;

 NSDictionary *burial = [self.filteredListContent objectAtIndex:indexPath.row];
NSString *lastname = burial[@"LastName"];
NSString *firstname = burial[@"FirstName"];

NSString *burialname = [NSString stringWithFormat: @"%@, %@", lastname, firstname];
 cell.textLabel.text = burialname;


NSLog(@"Cell name= %@ index path=%i", cell.textLabel.text, indexPath.row);
return cell;

}

3 个答案:

答案 0 :(得分:1)

我改变逻辑一次去服务器获取我的内容,这次包括我的内容表中的范围指示符。这使我能够处理范围过滤器,而无需返回服务器以获取特定范围的数据。这样做会导致在更改范围时显示正确的视图表。我不建议每当搜索范围发生变化时都会按原样进入服务器,因为它确实搞砸了视图表。

答案 1 :(得分:0)

你是如何使用搜索栏的?逻辑应该是你有所有数据的tableview,你使用搜索栏过滤掉匹配的结果并将它们添加到搜索数据数组,当搜索栏处于活动状态时,你显示搜索数据数组。

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString

用在某个地方?

添加以下

如果您设置了此功能,则可以使用

之类的内容更新搜索阵列并重新加载
if (self.searchDisplayController.searchResultsTableView != nil)
{
    //Updates searchData array
    [self searchDisplayController:self.searchDisplayController shouldReloadTableForSearchString:searchBar1.text];

    //Updates display
    [self.searchDisplayController.searchResultsTableView reloadData];

}
else
{
    [_channelsTableView reloadData];
}

它使用当前搜索栏文本调用searchDisplayController。当新的tableview数据来自服务器时,您可以激活searchDisplayController来刷新搜索结果数组,然后就可以刷新显示。

答案 2 :(得分:0)

有些事情要尝试:

  1. 也许你过早地重新加载你的tableView,或者
  2. 您的cellForRowAtIndexPath需要区分表格视图(就像您的numberOfRowsInSection一样)或
  3. 也许您没有正确设置所有代表。 searchBar与UISearchDisplayController一起使用,其中包含2个代理:searchResultsDataSourcesearchResultsDelegate。确保将它们设置为self(或任何类处理这些)。