20

私はtableviewUISearchDisplayControllerのストーリーボードにUIViewControllerの設定をしています。UISearchDisplayControllerとUITableViewのプロトタイプセルクラッシュ

私はself.tableview(ストーリーボードのメインテーブルビューに接続されている)からカスタムプロトタイプセルを使用しようとしています。 self.tableviewが表示をロードするときに少なくとも1つのセルを返しても問題はありませんが、self.tableviewにセルがロードされず(データがないため)、UISearchBarをロードして検索すると

- (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には何も作成されていないので、これが原因ですか?

+0

'configureCell:atIndexPath:'メソッドのコードを投稿できますか?問題はそこにあるかもしれません –

+0

それがそこに来る前にクラッシュします... – mootymoots

+0

が上に追加されましたが、それを追加します...本当に多くはありません – mootymoots

答えて

-1

メソッドcelForRowAtIndexPathでUISearchDisplayControllerを使用する場合は、コントローラの保持ポインターではなくtableViewパラメーターmethodeを使用する必要があります。メソッドのテーブルビューを使用するように

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

そして更新cellForRowAtIndexPath:のviewDidLoadで

は、このコード

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

CustomSearchCell識別子がUISearchDisplayControllerセルに存在しません。これは、ストーリーボードの元のテーブルビューのプロトタイプセルです。ストーリーボードのUISearchDisplayControllerにプロトタイプのセルを追加することはできません... AFAIK – mootymoots

7

私は新しいXIBにプロトタイプセルを複製することによって、これを解決してみてください元のself.tableview:

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

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

UISearchDisplayControllerはプライマリテーブルを持つことに加えて、独自のUITableView(フィルタテーブル)を管理します。フィルタリングされたテーブルのセル識別子がプライマリテーブルと一致しません。あなたはまた、など、両方のテーブルは、行数に対して互いに大きく異なることができないようindexPathによって細胞を取得したい

ので、代わりにこれをやって:

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

ではなく、次の操作を行います。

UITableViewCell *cell = 
[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
+3

私はこれで良い2時間のために苦労していました。あなたの応答は、テーブルが大幅に異なるインデックスを持つ可能性があるため、特にforIndexPathを省略することに注意してください。また、他の読者には:tableviewだけでなく、self.tableviewを持っていることを確認してください。 – ThinkBonobo

+0

素晴らしいです。私の一日を作った。 –

+1

5月神があなたを祝福します – shannoga

0

これは古い話題ですが、誰もが、まだ同じ問題に実行する場合、私のためにそれがのviewDidLoad

self.tableView.estimatedRowHeight = 80; 
で、このラインを有することに関連していました

同時に

if (indexPath.row == 0) { 
    return 44 + cellTopSpacing; 
} else { 
    return 44; 
} 

推定行の高さを取り外し、異なる条件で可変高さを有するheightForRowAtIndexPathデリゲートメソッドを実装するには、それを解決しました。

関連する問題