この問題に対するより良い解決策を見つけました.iOS 6 と 7 で完全に動作するようです. 他のソリューションは一貫して機能せず、一部の UISearchDisplayDelegate メソッドが起動されません! さらに、上記の方法では解決できない複雑なはめ込みの問題がありました。他のソリューションの主な問題は、UISearchDisplayController の内部をひどく混乱させることです。私の解決策は、UISearchDisplayContoller が UISearchbarDelegate であり、検索フィールドでキーを押すことをシミュレートすることで、結果テーブルの自動非調光と表示をトリガーできるという観察に基づいています! そう:
- (void) searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller
{
if ([controller respondsToSelector: @selector(searchBar:textDidChange:)])
[(id<UISearchBarDelegate>)controller searchBar: controller.searchBar textDidChange: @" "];
}
このコードは、UISearchbarDelegate メソッドに応答することをチェックすることでクラッシュに対する将来の証明となり、スペース @" " を送信して UISearchDisplayController をだましてユーザーが文字を入力したと思わせるようにします。
ユーザーが何かを入力してから消去すると、テーブルが再び暗くなります。他のソリューションでは、searchDisplayController:didHideSearchResultsTableView: メソッドで何かを行うことで、これを回避しようとします。しかし、これは私には意味がありません。検索をキャンセルすると、結果テーブルを完全に非表示にする必要があり、この場合はコードを実行する必要があるかもしれません。この部分に対する私の解決策は、サブクラス化することです (プロジェクトで必要に応じて、Method Swizzled カテゴリを使用してどこでも機能させることができることに注意してください):
// privately declare protocol to suppress compiler warning
@interface UISearchDisplayController (Super) <UISearchBarDelegate>
@end
// subclass to change behavior
@interface GMSearchDisplayController : UISearchDisplayController
@end
@implementation GMSearchDisplayController
- (void) searchBar: (UISearchBar *) searchBar textDidChange: (NSString *) searchString
{
if (searchString.length == 0)
searchString = @" ";
if ([super respondsToSelector: @selector(searchBar:textDidChange:)])
[super searchBar: searchBar textDidChange: searchString];
}
@end
このコードは、textDidChange デリゲート メソッドをインターセプトし、nil または空の文字列をスペース文字列 @" " に変更することで機能し、空の検索バーで発生する通常の非表示/淡色表示を防ぎます。この 2 番目のビットのコードを使用している場合は、最初のビットを変更して @" " の代わりに nil を渡すことができます。これは、この 2 番目のビットが必要な @" " への変換を行うためです。
私自身のプロジェクトでは、ユーザーがスペースを入力した場合を処理する必要があったため、上記の @" " の代わりに、定義済みのトークンを使用しました。
// arbitrary token used internally
#define SEARCH_PRELOAD_CONDITIONAL @"_#preresults#_"
そして、nil 文字列に変換して内部的に処理します。
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
if ([searchString isEqualToString: SEARCH_PRELOAD_CONDITIONAL])
searchString = nil;
}
楽しみ!:)