2

uisearchbarからステーションを選択できる設定画面を作成しています。ステーションの最初の文字をヘッダーとして、すべてのステーションが最初の文字で分類された、セクション化されたテーブルビューがあります。ここまでは順調ですね。セクションごとにステーションを備えた2つのNSMutableArrayがあります。1つはフィルター処理されていない配列(フィルター処理されていない場合に使用します)で、もう1つは何かを検索している場合です。(私は述語を介してこれを行います)。キーボードのキーを押すたびに、[self.tableViewreloadData]を実行します。これは機能しますが、スクロールビューが長すぎます。したがって、選択した配列に実際に含まれる結果の数を超えてスクロールできます。存在しないオブジェクトを取得しようとしているため、これによりクラッシュが発生します。

それで、テーブルビューは配列を正しくカウントしていないように見えますか?この問題に精通している人はいますか?

ここにいくつかのコードがあります:

- (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]; を呼び出すだけで済みます。他の 3 つのメソッドではなく、textDidChange で。お役に立てれば。

于 2012-11-21T11:21:51.947 に答える