UISearchBar
のtextField
に表示されるUISearchBar
クロスを非表示にする方法と表示しない方法を知りたいのですが。
これを使ってみました
filterSearchBar.showsCancelButton = NO;
ただし、これは実際のキャンセルボタンであり、小さな灰色の十字ではないため、UISearchBar
に表示される小さな灰色のボタンに相当するものがあるかどうかを知りたいと思います。
検索バーのtextFieldを取得する必要があります。
UITextField *textField = [searchBar valueForKey:@"_searchField"];
textField.clearButtonMode = UITextFieldViewModeNever;
この助けを願っています! =)
これを行うためのより良い方法があり、プライベートAPIを使用したり、サブビューをトラバースしたりする必要がないため、このソリューションはAppStoreで安全です。
UISearchBarには、これを行うための組み込みAPIがあります。
[UISearchBar setImage:forSearchBarIcon:state]
必要なSearchBarアイコンキーはUISearchBarIconClearであり、UIControlStateNormal状態が必要です。次に、画像の鮮明な画像を提供します。これで完了です。
したがって、次のようになります。
[searchBar setImage:clearImage forSearchBarIcon:UISearchBarIconClear state:UIControlStateNormal];
@Ginesの回答に基づいて、ここにSwiftバージョン:
func searchBarTextDidBeginEditing(searchBar: UISearchBar) {
guard let firstSubview = searchBar.subviews.first else { return }
firstSubview.subviews.forEach {
($0 as? UITextField)?.clearButtonMode = .never
}
}
Swift 4
アレクサンダーの答えに追加し、クリアボタンでユーザーの操作をブロックします。
ボタンを非表示にするには:
searchBar.setImage(UIImage(), for: .clear, state: .normal)
クリアボタンでのユーザー操作を無効にするには、UISearchBarをサブクラス化するだけです
class CustomSearchBar: UISearchBar {
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
let view = super.hitTest(point, with: event)
if view is UIButton {
return view?.superview // this will pass-through all touches that would've been sent to the button
}
return view
}
}
すべてのUISearchBarインスタンスのクリアテキストボタンを削除できます。
[UITextField appearanceWhenContainedInInstancesOfClasses:@[[UISearchBar class]]].clearButtonMode = UITextFieldViewModeNever;
@Alexsanderの回答に基づくSwift3:
searchBar.setImage(UIImage(), for: .clear, state: .normal)
Swift 3ソリューション:
extension UISearchBar{
var textField : UITextField{
return self.value(forKey: "_searchField") as! UITextField
}
}
使用法 :
searchBar.textField.clearButtonMode = .never
これを試して:
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
UITextField *textField = [searchBar valueForKey:@"_searchField"];
textField.clearButtonMode = UITextFieldViewModeNever;
}
この投稿で選択したものも含めて、この問題についてさまざまな解決策を試しましたが、うまくいきませんでした。
これは私がこの問題を解決するために見つけた方法です:
UIView *subview = [[searchBar subviews] firstObject]; //SearchBar only have one subview (UIView)
//There are three sub subviews (UISearchBarBackground, UINavigationButton, UISearchBarTextField)
for (UIView *subsubview in subview.subviews)
{
//The UISearchBarTextField class is a UITextField. We can't use UISearchBarTextField directly here.
if ([subsubview isKindOfClass: [UITextField class]])
{
[(UITextField *)subsubview setClearButtonMode:UITextFieldViewModeNever];
}
}
iOS 13でテスト済み
私のために働いている1つのライナー:
searchBar.searchTextField.clearButtonMode = .never
.whileEditing
に設定して、ユーザーが入力しているときに表示し、検索バーがフォーカスを失ったときに削除することもできます。
@Alexsanderの回答に基づくSwift2.3:
searchBar.setImage(UIImage(named: "SearchClearIcon"), forSearchBarIcon: UISearchBarIcon.Clear, state: UIControlState.Highlighted)
searchBar.setImage(UIImage(named: "SearchClearIcon"), forSearchBarIcon: UISearchBarIcon.Clear, state: UIControlState.Normal)
thijsonlineの answer in Swift:
(UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self])).clearButtonMode = .never
Soto_iGhostの answer をSwift 4:
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
let textField: UITextField = searchBar.value(forKey: "_searchField") as! UITextField
textField.clearButtonMode = .never
}
UISearchBar
のアウトレットがある場合は、クラスのどこにでも上記のコードを記述できます。
Swift 2.3の場合は次を使用してください:
var searchBar = UISearchBar();
searchBar.frame = CGRectMake(0, 0, 00, 20))
for subview: UIView in (searchBar.subviews.first?.subviews)!
{
if (subview.isKindOfClass(UITextField) )
{
let textFieldObject = (subview as! UITextField)
textFieldObject.clearButtonMode = .Never;
}
}