2

我正在制作一个设置屏幕,您可以在其中通过 uisearchbar 选择电台。我有一个分段的表格视图,其中一个站的第一个字母作为标题,每个站都按它的第一个字母分类。到目前为止,一切都很好。我有 2 个 NSMutableArray,每个部分都有这些站。一个是未过滤的数组(当我没有过滤它时我会使用它),另一个是当我搜索某些东西时。(我通过谓词做到这一点)。在键盘上的每个按键上,我都会执行 [self.tableView reloadData]; 这行得通,但是滚动视图停留的时间太长了!因此,您可以滚动查看所选数组中实际有多少结果。这会导致崩溃,因为它试图获取不存在的对象。

因此,似乎 tableview 没有正确计算数组或其他什么?有人熟悉这个问题吗?

这是一些代码:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    if (self.searching) {
        return [self.tableFilterd count];
    } else {
        return [self.tableData count];
    }
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSLog(@"Rows for section");
    // Return the number of rows in the section.
    if (self.searching) {
        NSLog(@"Editing section: %i, count %i", section, [[self.tableFilterd objectAtIndex:section] count]);
        return [[self.tableFilterd objectAtIndex:section] count];
    } else {
        NSLog(@"Not editing");
        return [[self.tableData objectAtIndex:section] count];
    }
}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {

    SettingsHeaderCell *cell = [[[SettingsHeaderCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"HeaderCell"] autorelease];

    cell.labelLetter.text = [[self.tableLetters objectAtIndex:section] capitalizedString];

    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return 40;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 52;
}

- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    SettingsCell *cell = [theTableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[[SettingsCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    if (self.searching) {
        StationObject *object = (StationObject *)[[self.tableFilterd objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
        [cell setStationObject:object];
    } else {
        StationObject *object = (StationObject *)[[self.tableData objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
        [cell setStationObject:object];
    }

    return cell;
}
4

1 回答 1

0

您现在可能已经解决了这个问题,但我怀疑您没有清空任何一个数组。在方法中:

- (void)searchBar:(UISearchBar *)theSearchBar textDidChange:(NSString *)searchText
{

//Remove all objects first
[self.tableFiltered removeAllObjects];
[self.tableData removeAllObjects];

你也只需要调用 [self.tableView reloadData]; 在 textDidChange 中,而不是在其他三个方法中。希望这可以帮助。

于 2012-11-21T11:21:51.947 回答