私のnibからアウトレット経由でViewControllerに接続されたUISearchDisplayControllerとUISearchBarがあります。
キャンセルボタンを非表示にして、ユーザーに表示されないようにしたい。問題は、次のコードがボタンを非表示にすることですが、ボタンをユーザーに1秒間表示した後でのみです(たとえば、シミュレーターとデバイスで点滅し、表示されなくなります)。
- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller
{
controller.searchBar.showsCancelButton = NO;
}
それを隠すより良い方法はありますか?
UISearchBar
をサブクラス化して「キャンセル」ボタンを非表示にし、このメソッドをオーバーライドしました。
-(void)layoutSubviews{
[super layoutSubviews];
[self setShowsCancelButton:NO animated:NO];
}
同じ問題がありましたが、別の方法で修正しました。
UISearchDisplayController
をサブクラス化できない、またはしたくない人のために、UIKeyboardWillShowNotification
にリスナーを追加し、そこに[self setShowsCancelButton:NO animated:NO]
を設定することで問題を修正しました。
viewWillAppear:
:
// Add keyboard observer:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillAppear:)
name:UIKeyboardWillShowNotification
object:nil];
次に、以下を作成します。
- (void)keyboardWillAppear:(NSNotification *)notification
{
[YOUR-SEARCHBAR-HERE setShowsCancelButton:NO animated:NO];
}
追加することを忘れないでください、
[[NSNotificationCenter defaultCenter] removeObserver:self];
viewWillDisappear:
!
お役に立てれば!
Nimrodの回答と同様に、UISearchDisplayController
をサブクラス化し、setActive:animated:
メソッドを実装することもできます。
- (void)setActive:(BOOL)visible animated:(BOOL)animated {
[super setActive:visible animated:animated];
self.searchBar.showsCancelButton = NO;
}
これはXcode内のバグのようです。私はこのエラーをAppleのバグ報告サイトに提出しましたが、彼らはフォローアップしてサンプルコードとユースケースの追加を求めてきました。
この問題を解決してくれてありがとうございます。
class CustomSearchBar: UISearchBar {
override func setShowsCancelButton(showsCancelButton: Bool, animated: Bool) {
super.setShowsCancelButton(false, animated: false)
}
}
class CustomSearchController: UISearchController, UISearchBarDelegate {
lazy var _searchBar: CustomSearchBar = {
[unowned self] in
let customSearchBar = CustomSearchBar(frame: CGRectZero)
customSearchBar.delegate = self
return customSearchBar
}()
override var searchBar: UISearchBar {
get {
return _searchBar
}
}
}
UISearchBar
をUISearchController
とともに使用すると、この問題が発生しました。私は自分のキャンセルボタンをキャンセルボタンとして使用しています iPadでは表示されませんでした with showsCancelButton = YES
、今はiPhoneでshowsCancelButton = NO
で非表示になりません!
以下は私のために働いた。
デリゲートと初期値を設定します。
- (void)viewDidLoad
{
// ...
self.searchController.searchBar.showsCancelButton = NO;
self.searchController.searchBar.delegate = self;
}
テキストバーが編集を開始してからshowsCancelButton
をNO
0.1秒にリセットします。
#pragma mark - UISearchBarDelegate
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
self.searchController.searchBar.showsCancelButton = NO;
});
}
サブクラス化を避けたい場合は実装
searchController.searchBar.showsCancelButton = false;
これらの2つのデリゲートメソッド内(デリゲートを割り当てることを忘れないでください):
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController
- (void)didPresentSearchController:(UISearchController *)searchController
1つ目はsearchBarを更新するたびに呼び出され(デフォルトでは[キャンセル]ボタンが表示されます)、2つ目は最初のsearchBarのアクティブ化用です。
IOS8で非推奨となったUISearchDisplayControllerの後、Appleハンドル検索表示をUISearchControllerDelegateに与えます。
以下のように、searchBarをオーバーライドして[キャンセル]ボタンを非表示にすることができます。
- (void)didPresentSearchController:(UISearchController *)searchController {
[searchController.searchBar setShowsCancelButton:NO];
}
非アクティブ状態から非表示の[キャンセル]ボタンが必要な場合は、initにsearchBarを設定する必要があります。
search = [[UISearchController alloc] initWithSearchResultsController:nil];
[search.searchBar setShowsCancelButton:NO];
私が以前に経験した問題に基づいて、それを設定しようとしたことがあります:
- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller
これが場違いである場合、申し訳ありませんが質問でこの質問をする方法がわかりません。
検索バーの検索フィールドの編集中にキャンセルボタンが表示された場合は、次の操作を実行できます。検索バーをサブクラス化し、UITextFieldDelegate
protocolを実装します。
@interface CustomAlignedSearchBar : UISearchBar<UITextFieldDelegate>
次にtextFieldDidBeginEditing:
を実装し、次のようにします。
- (void)textFieldDidBeginEditing:(UITextField *)textField{
[self setShowsCancelButton:self.cancelButtonShown animated:NO];
}
これにより、キャンセルボタンが表示されなくなります。