Как обрабатывать событие при нажатии кнопки "x"?
Я пробую этот метод, но не работает.
-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{
}
Как обрабатывать событие при нажатии кнопки "x"?
Я пробую этот метод, но не работает.
-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{
}
Я не думаю, что есть простой способ зацепиться за кнопку X.
Тем не менее, вы можете подключиться к его прямому следствию: очищенный текст.
Попробуй это:
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
if searchText == "" {
print("UISearchBar.text cleared!")
}
}
Побочный эффект также вызван, когда вы вручную очищаете текст.
Довольно хакерский способ сделать это, но это работает.
private var didTapDeleteKey = false
func searchBar(_ searchBar: UISearchBar,
shouldChangeTextIn range: NSRange,
replacementText text: String) -> Bool
{
didTapDeleteKey = text.isEmpty
return true
}
func searchBar(_ searchBar: UISearchBar,
textDidChange searchText: String)
{
if !didTapDeleteKey && searchText.isEmpty {
// Do something here
}
didTapDeleteKey = false
}
Успех этого кода зависит от того, что при нажатии кнопки очистки на панели поиска searchBar(_:shouldChangeTextIn:replacementText:) → Bool
не вызывается. Вместо этого, когда нажимается кнопка удаления на клавиатуре, вызывается метод.
У меня была одна и та же проблема, я попытался ее решить, обратившись к поисковому элементу searchBar subview textField, но это вызвало крах моего приложения, и с последним усилием я нашел этот пост.
Другая проблема заключалась в том,
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
вызывается дважды при нажатии кнопки отмены, см. также это.
И последнее, что я сделал;
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
if (![searchText isEqualToString:self.searchText]) {
self.searchText = searchText;
return;
}
NSLog(@"Clear clicked");
}
Это решило мою проблему.
Это работает для меня
-(UITextField*)getUITexfieldInUISearchBar:(UIView*)aSearchBar{
UITextField *searchBarTextField;
for (UIView *subView in [aSearchBar subviews]){
if ([subView isKindOfClass:[UITextField class]])
{
searchBarTextField = (UITextField *)subView;
[searchBarTextField setDelegate:self];
break;
}else if ([subView isKindOfClass:[UIView class]]){
[self getUITexfieldInUISearchBar:subView];
}
}
return searchBarTextField;
}
И вы можете использовать делегат TextFields
- (BOOL)textFieldShouldClear:(UITextField *)textField {
//Do something here...
}
Вы можете подключиться к событию "Отменить кнопку", выбрав "UISearchBarDelegate", а затем внедрить метод "SearchBarCancelButtonClicked"
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String){
print("searchText: \(searchText)")
if searchText.count > 0
{
// Show ur content
}
else
{
// Hide your content
}
}
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
if (searchText.length == 0) {
//clear button (x) on the search bar is cliecked, so clear the table
[self clearTable];
}
}
... просто работает
if(searchText.length==0||searchText==nil){
[self.searchBar resignFirstResponder];
[NSTimer scheduledTimerWithTimeInterval:0.1
target:self
selector:@selector(hideKeyboard)
userInfo:nil
repeats:NO];
}
- (void)hideKeyboard{
[self.searchBar resignFirstResponder];
}
Самое простое решение в Swift 5.0
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchText.isEmpty {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
searchBar.resignFirstResponder()
}
}
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
let inputString = searchText.trimmingCharacters(in: NSCharacterSet.whitespacesAndNewlines)
if inputString.characters.count > 0
{
}
else
{
//Write code here for Clear button action
}
}