[解決済み] UITableViewControllerでUISearchDisplayControllerを使用する際のアサーション失敗について
2023-07-10 05:35:07
質問
私のアプリのTableViewControllerに簡単な検索機能を追加しようとしています。Ray Wenderlichのチュートリアルに従いました。私はいくつかのデータを持つtableViewを持っており、私はstoryboardで検索バー+ディスプレイコントローラを追加し、そして私はこのコードを持っています。
#pragma mark - Table View
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"BreedCell" forIndexPath:indexPath];
//Create PetBreed Object and return corresponding breed from corresponding array
PetBreed *petBreed = nil;
if(tableView == self.searchDisplayController.searchResultsTableView)
petBreed = [_filteredBreedsArray objectAtIndex:indexPath.row];
else
petBreed = [_breedsArray objectAtIndex:indexPath.row];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.textLabel.text = petBreed.name;
return cell;
}
#pragma mark - Search
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
[_filteredBreedsArray removeAllObjects];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.name contains[c] %@",searchString];
_filteredBreedsArray = [[_breedsArray filteredArrayUsingPredicate:predicate] mutableCopy];
return YES;
}
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption {
// Tells the table data source to reload when scope bar selection changes
[_filteredBreedsArray removeAllObjects];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.name contains[c] %@",self.searchDisplayController.searchBar.text];
_filteredBreedsArray = [[_breedsArray filteredArrayUsingPredicate:predicate] mutableCopy];
return YES;
}
標準的なものですが、検索バーにテキストを入力すると、このエラーで毎回クラッシュしてしまいます。
2013-01-07 19:47:07.330 FindFeedo[3206:c07] *** Assertion failure in -[UISearchResultsTableView dequeueReusableCellWithIdentifier:forIndexPath:], /SourceCache/UIKit_Sim/UIKit-2372/UITableView.m:4460
2013-01-07 19:47:07.330 FindFeedo[3206:c07] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier BreedCell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'
iOS6でセルの処理とデキューの仕組みが変わったこと、また検索では別のtableViewを使うことは理解していたので、フィルタリングされた結果を表示する検索のtableViewがセルについて知らないことが問題だと思い、viewDidLoadにこのように記述しています。
[self.searchDisplayController.searchResultsTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"BreedCell"];
で、出来上がり。うまくいきました... 最初に検索したときだけです。元の結果に戻ってもう一度検索すると、同じエラーでアプリがクラッシュしてしまいます。もしかしたら、すべての
if(!cell){//init cell here};
のようなものをcellForRowメソッドに追加していますが、これはdequeueReusableCellWithIdentifier:forIndexPath:メソッドを持つ全体の目的に反しないでしょうか?とにかく、私は迷っています。何が足りないのでしょうか?助けてください。いつもありがとうございます(。
アレックスです。
どのように解決するのですか?
dequeueReusableCellWithIdentifierでtableViewの代わりにself.tableViewを使用してみてください。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"BreedCell"];
//Create PetBreed Object and return corresponding breed from corresponding array
PetBreed *petBreed = nil;
if(tableView == self.searchDisplayController.searchResultsTableView)
petBreed = [_filteredBreedsArray objectAtIndex:indexPath.row];
else
petBreed = [_breedsArray objectAtIndex:indexPath.row];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.textLabel.text = petBreed.name;
return cell;
}
このコードはかなりうまく動作します
注意
高さをカスタマイズしたセルを使用している場合は
[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
代わりにこれを使う
[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
関連
-
[iOS]コンパイルエラー:ld: アーキテクチャ x86_64 のシンボルが見つかりません。
-
[解決済み] キーボードがあるときに、UITextFieldを編集開始時に上に移動させるには?
-
[解決済み] performSelectorのセレクタが不明なため、リークが発生する可能性があります。
-
[解決済み] 制約条件の変更をアニメーションで表現するには?
-
[解決済み] iOS Simulatorでネットワークを無効にすることは可能ですか?
-
[解決済み] iOS - UITextFieldの外側をタッチするとキーボードが外れる。
-
[解決済み] SwiftでiOSキーボードを任意の場所でタッチして閉じる
-
[解決済み] NSNotificationCenterのaddObserver in Swift
-
[解決済み】dequeueReusableCellWithIdentifier:forIndexPathでアサーションに失敗しました。
-
[解決済み】UITableViewControllerを使用しないUIRefreshControl
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
EXC_BAD_ACCESS (code=2, address=0x0)
-
[解決済み] 奇妙な不要なXcodeログを隠す
-
[解決済み] Xcodeにおけるバージョンとビルドの比較
-
[解決済み] Xcode 12、iOS Simulator用にビルドしても、iOS用にビルドされたオブジェクトファイルでは、アーキテクチャ「arm64」用にリンクされます。
-
[解決済み] UITableViewCell、スワイプ時に削除ボタンを表示させる
-
[解決済み] iOS 13でダークモードをオプトアウトすることは可能ですか?
-
[解決済み] UIViewの角丸とドロップシャドウ?
-
[解決済み] UITextFieldのテキストインセット?
-
[解決済み] swiftで電子メールアドレスを検証する方法は?
-
[解決済み] Cocoapods警告 - CocoaPodsがプロジェクトの基本構成を設定しなかった理由は、プロジェクトに既にカスタム構成が設定されているためです。