20

と をUIViewController含むストーリーボードにセットアップがtableviewありますUISearchDisplayController

self.tableview (ストーリーボードのメイン テーブルビューに接続されている) からカスタム プロトタイプ セルを使用しようとしています。self.tableviewビューをロードしたときに少なくとも 1 つのセルが返された場合は正常に動作しますがself.tableview、(データがないため) セルをロードせず、UISearchBarand 検索をロードすると、cellForRowAtIndexPath:メソッドがクラッシュします。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomSearchCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"CustomSearchCell" forIndexPath:indexPath];

    [self configureCell:cell atIndexPath:indexPath];
    return cell;
}

-(void)configureCell:(CustomSearchCell *)cell atIndexPath:(NSIndexPath *)indexPath {
    User *user = [self.fetchedResultsController objectAtIndexPath:indexPath];

    cell.nameLabel.text = user.username;
}

エラー:

*** Assertion failure in -[UITableViewRowData rectForRow:inSection:heightCanBeGuessed:]
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'request for rect at invalid index path (<NSIndexPath: 0x9ef3d00> {length = 2, path = 0 - 0})

上記のメソッドが呼び出された時点で、私の fetchedResultsController にはデータ (1 セクション、2 行) があるようです。ライン上でクラッシュしdequeueReusableCellWithIdentifierます。

ポインタ/アイデアはありますか?からプロトタイプセルをデキューする必要がありますself.tableviewが、作成されたものがなかったself.tableviewので、これが原因でしょうか?

4

3 に答える 3

60

UISearchDisplayController は、プライマリ テーブルに加えて、独自の UITableView (フィルター処理されたテーブル) を管理します。フィルター処理されたテーブルのセル識別子がプライマリ テーブルと一致しません。また、行数などに関して両方のテーブルが互いに大きく異なる可能性があるため、indexPath ではなくセルをフェッチする必要があります。

したがって、これを行う代わりに:

UITableViewCell *cell =
[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier
forIndexPath:indexPath];

代わりにこれを行います:

UITableViewCell *cell =
[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
于 2013-10-05T06:50:56.843 に答える
7

プロトタイプセルを新しいxibに複製することでこれを解決しました:

ビューでDidLoad:

[self.searchDisplayController.searchResultsTableView registerNib:[UINib nibWithNibName:@"CustomSearchCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"CustomSearchCell"];

元の self.tableview ではなく、メソッドの tableview を使用するように cellForRowAtIndexPath を更新しました。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    CustomSearchCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomSearchCell" forIndexPath:indexPath];

    [self configureCell:cell atIndexPath:indexPath];
    return cell;
}
于 2013-09-01T16:46:12.043 に答える