iOS 8 以降で を使用しているUISearchController
場合は、単純に をサブクラス化する必要があります。完全を期すために、私が行ったようにキャンセルボタンを非表示にすることもできます。使用したい場合は、そのコードを以下に追加しました。UISearchController
UISearchBar
これの利点は、 のサブクラスを要求するのではなく、任意のクラスおよび任意のビューにこれを使用できることですUIViewController
。UISearchController
このソリューションの最後に、初期化方法も含めます。
FJSearchBar
このクラスは、私が行ったようにキャンセル ボタンを非表示にする場合にのみオーバーライドする必要があります。マーキングはiOS 8searchController.searchBar.showsCancelButton = NO
では機能しないようです。iOS 9はテストしていません。
FJSearchBar.h
空ですが、完全を期すためにここに配置されています。
@import UIKit;
@interface FJSearchBar : UISearchBar
@end
FJSearchBar.m
#import "FJSearchBar.h"
@implementation FJSearchBar
- (void)setShowsCancelButton:(BOOL)showsCancelButton {
// do nothing
}
- (void)setShowsCancelButton:(BOOL)showsCancelButton animated:(BOOL)animated {
// do nothing
}
@end
FJSearchController
ここで、実際の変更を行います。UISearchBarDelegate
カテゴリを独自のカテゴリに分割したのは、私見ですが、カテゴリによってクラスがクリーンになり、保守が容易になるためです。デリゲートをメイン クラス インターフェイス/実装内に保持したい場合は、そうすることを歓迎します。
FJSearchController.h
@import UIKit;
@interface FJSearchController : UISearchController
@end
@interface FJSearchController (UISearchBarDelegate) <UISearchBarDelegate>
@end
FJSearchController.m
#import "FJSearchController.h"
#import "FJSearchBar.h"
@implementation FJSearchController {
@private
FJSearchBar *_searchBar;
BOOL _clearedOutside;
}
- (UISearchBar *)searchBar {
if (_searchBar == nil) {
// if you're not hiding the cancel button, simply uncomment the line below and delete the FJSearchBar alloc/init
// _searchBar = [[UISearchBar alloc] init];
_searchBar = [[FJSearchBar alloc] init];
_searchBar.delegate = self;
}
return _searchBar;
}
@end
@implementation FJSearchController (UISearchBarDelegate)
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar {
// if we cleared from outside then we should not allow any new editing
BOOL shouldAllowEditing = !_clearedOutside;
_clearedOutside = NO;
return shouldAllowEditing;
}
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
// hide the keyboard since the user will no longer add any more input
[searchBar resignFirstResponder];
}
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
if (![searchBar isFirstResponder]) {
// the user cleared the search while not in typing mode, so we should deactivate searching
self.active = NO;
_clearedOutside = YES;
return;
}
// update the search results
[self.searchResultsUpdater updateSearchResultsForSearchController:self];
}
@end
注意すべきいくつかの部分:
BOOL
プロパティの代わりにプライベート変数として
検索バーとを配置しました。
- それらは私有地よりも軽量です。
- 外部から見たり変更したりする必要はありません。
searchBar
がファーストレスポンダーかどうかを確認します。そうでない場合は、テキストが空であり、もはや検索していないため、実際に検索コントローラーを無効にします。本当に確認したい場合は、 searchText.length == 0
.
searchBar:textDidChange:
の前に呼び出されるsearchBarShouldBeginEditing:
ため、この順序で処理しました。
- テキストが変更されるたびに検索結果を更新しますが、ユーザーが [検索
[self.searchResultsUpdater updateSearchResultsForSearchController:self];
] ボタンを押した後にのみ検索を実行する場合は、 を に移動することをお勧めします。searchBarSearchButtonClicked: