0

検索バーのあるテーブル ビューがあります。最初に、テーブル ビューにはすべて (10 個) のアイテムが表示されます。セルを選択すると、詳細ビ​​ューがナビゲーション コントローラー スタックにプッシュされ、[戻る] ボタンをタップしてテーブル ビューに戻ることができます。検索テキストをまだ入力していない限り、テーブル ビューにはすべてのアイテムが表示され、詳細ビューとテーブル ビューの間を無期限に行き来できます。

検索バーにテキストを入力すると、テーブル ビューが self.searchDisplayController.searchResultsTableView で正しく更新されます (現在 8 項目しか表示されていないとします)。

(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

8 回呼び出されます (セクション 0、行 0 ~ 7)。罰金。

次に、セルをタップして詳細ビューを表示し、8 つのアイテムを表示するテーブル ビューに戻ることができます。

次に、まだ 8 つの項目が表示されているテーブル ビューのセルを選択すると (以前と同じセルでも別のセルでもかまいません)、詳細ビューが再び表示され、[戻る] ボタンをタップします。

(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

セクション 0、行 8 に対して呼び出されますが、これはsearchResultsTableViewまだ検索から 8 項目 (行 0 から 7) しか表示されないため、存在しません。

何が起こっているのかよくわかりません:

  • 検索が正しく機能し、
  • しかしcellForRowAtIndexPath、「間違った」indexPathで呼び出されます

編集: 2 つのテーブル ビューを混同するという前提を削除しました。

編集 2: これは cellForRowAtIndexPath です。「Zeichen」は DAO です。getZeichenForIndexPath:indexPath は、検索結果から正しいインスタンスを返します。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SearchResultCell" ];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"SearchResultCell"];
    }

    Zeichen *zeichen = [self getZeichenForIndexPath:indexPath];

    UIImage *img = [UIImage imageNamed:zeichen.filename];
    cell.imageView.image = img;

    cell.textLabel.text = [zeichen description];
    return cell;
}
4

1 に答える 1

0

私はあなたがコントロールすべきだと思いますtableView == self.searchDisplayController.searchResultsTableView。このコントロールもdidSelectRowAtIndexPath:メソッド内にある必要があります。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
      if(tableView == self.searchDisplayController.searchResultsTableView)
      {
             UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SearchResultCell" ];
             if (cell == nil) {
                  cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"SearchResultCell"];
             }
      }
      else
      {
            UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" ];
             if (cell == nil) {
                  cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
             }
      }
    return cell;
}

他の考え:[tableView dequeueReusableCellWithIdentifier:@"SearchResultCell" forIndexPath:indexPath]ストーリーボードまたはペン先でテーブルビューを初期化する(ストーリーボードでセル識別子を設定する)場合、使用法はより便利です。

于 2013-11-05T16:09:23.350 に答える