Ответ 1
Вам нужно получить textField строки поиска:
UITextField *textField = [searchBar valueForKey:@"_searchField"];
textField.clearButtonMode = UITextFieldViewModeNever;
надеюсь, что эта помощь! =)
Я хотел бы знать, как скрыть или не отображать крест UISearchBar
который появляется в textField
для UISearchBar
Я пытался использовать это
filterSearchBar.showsCancelButton = NO;
Однако это настоящая кнопка отмены, а не маленький серый крестик, поэтому я хотел бы знать, есть ли эквивалент для маленькой серой кнопки, которая отображается в UISearchBar
.
Вам нужно получить textField строки поиска:
UITextField *textField = [searchBar valueForKey:@"_searchField"];
textField.clearButtonMode = UITextFieldViewModeNever;
надеюсь, что эта помощь! =)
Там лучший способ сделать это, и вам не нужно использовать частные API или перехватывать подзаголовки, чтобы это сделать, поэтому это решение является безопасным в App Store.
UISearchBar имеет встроенный API для этого:
[UISearchBar setImage: forSearchBarIcon: состояние]
Значок значка 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;
Swift 3, на основе ответа @Alexsander:
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
Я пробовал разные решения по этой проблеме, даже тот, который был выбран в этом сообщении, но они не работали.
Вот как я нашел решение этой проблемы:
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];
}
}
Попробуйте следующее:
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
UITextField *textField = [searchBar valueForKey:@"_searchField"];
textField.clearButtonMode = UITextFieldViewModeNever;
}
В случае 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;
}
}
Swift 2.3, на основе ответа @Alexsander:
searchBar.setImage(UIImage(named: "SearchClearIcon"), forSearchBarIcon: UISearchBarIcon.Clear, state: UIControlState.Highlighted)
searchBar.setImage(UIImage(named: "SearchClearIcon"), forSearchBarIcon: UISearchBarIcon.Clear, state: UIControlState.Normal)
Преобразование ответа Soto_iGhost в Swift 4:
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
let textField: UITextField = searchBar.value(forKey: "_searchField") as! UITextField
textField.clearButtonMode = .never
}
Если у вас есть выход UISearchBar
вы можете написать код выше в любом месте вашего класса.
thijsonline ответ по-быстрому:
(UITextField.appearance(whenContainedInInstancesOf: [UISearchBar.self])).clearButtonMode = .never