How handle the event when press the 'x' button?
I try this method but not works.
-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{
}
How handle the event when press the 'x' button?
I try this method but not works.
-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{
}
I don't think there's an easy way to hook into the X button.
However, you can hook into its direct consequence: cleared text.
Try this:
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
if searchText == "" {
print("UISearchBar.text cleared!")
}
}
The side effect is this also gets called when you manually clear your text.
A rather hacky way to do it but this works.
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
}
The success of this code hinges on the fact that when tapping the clear button of the search bar, searchBar(_:shouldChangeTextIn:replacementText:) -> Bool
is not called. Instead when the delete button of the keyboard is tapped, the method is called.
Swift 5.2, Xcode 11.4
This one worked for me.
if let searchTextField = self.categoriesSearchBar.value(forKey: "searchField") as? UITextField , let clearButton = searchTextField.value(forKey: "_clearButton")as? UIButton {
clearButton.addTarget(self, action: #selector(self.yourFunction), for: .touchUpInside)
}
As stated in Apple's documentation there is a delegate method textFieldShouldClear(_:)
in UITextFieldDelegate
.
The text field calls this method in response to the user pressing the built-in clear button.
So
UITextFieldDelegate
searchBar
's text fieldtextFieldShouldClear(_:)
methodclass MyClass: UITextFieldDelegate {
weak var seachBar: UISearchBar!
override func viewDidLoad() {
if #available(iOS 13.0, *) {
searchBar.searchTextField.delegate = self
} else {
searchBar.textField.delegate = self
}
}
func textFieldShouldClear(_ textField: UITextField) -> Bool {
// your code
return true
}
}
Simplest solution in Swift 5.0
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchText.isEmpty {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
searchBar.resignFirstResponder()
}
}
}
I had the same issue and it was solve like that:
In search controller that inherits from UISearchController
I added conformance to UITextFieldDelegate
.
Then in init method the following line was addd:
searchBar.searchTextField.delegate = self
And implementing
func textFieldShouldClear(_ textField: UITextField) -> Bool
allows to achieve the information that clear button was pressed
I had the same issue, tried to solve it with accessing searchBar's subview textField but it caused my app crash, and with a last effort i found this post.
Another issue was that,
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
is being called twice when cancel button clicked, see also this.
And lastly what i did is;
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
if (![searchText isEqualToString:self.searchText]) {
self.searchText = searchText;
return;
}
NSLog(@"Clear clicked");
}
This solved my issue.
self.mySearchBar.searchTextField.delegate = self
extension myViewController: UISearchTextFieldDelegate {
func textFieldShouldClear(_ textField: UITextField) -> Bool {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
self.mySearchBar.searchTextField.resignFirstResponder()
}
return true
}
}
I think the simplest solution to this question is:
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchText.isEmpty {
DispatchQueue.main.async {
searchBar.resignFirstResponder()
}
}
This works for me
-(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;
}
And you can use the TextFields Delegate
- (BOOL)textFieldShouldClear:(UITextField *)textField {
//Do something here...
}
- (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];
}
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String){
print("searchText: \(searchText)")
if searchText.count > 0
{
// Show ur content
}
else
{
// Hide your content
}
}
... just works
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];
}
Until apple releases a proper delegate method for clear button event handling this will work as of Xcode 12. Requires: >=iOS13
Get a reference to the searchBar clearButton
if possible.
UIButton *searchBarTextFieldClearButton = [self.searchBar.searchTextField valueForKey:@"_clearButton"];
if (searchBarTextFieldClearButton) {
[searchBarTextFieldClearButton addTarget:self action:@selector(searchTextFieldClearButtonTapHandler) forControlEvents:UIControlEventTouchUpInside];
}
Swift:
extension UISearchTextField {
var clearButton: UIButton? {
return value(forKey: "_clearButton") as? UIButton
}
}
searchBar.searchTextField.clearButton.addTarget(self, #selector(handler), .touchUpInside) //bllah
Very important to keep in mind that your "action - searchTextFieldClearButtonTapHandler
" gets called last. That is, after the delegate method - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
You can hook up to "Cancel button" clicked event by conforming to "UISearchBarDelegate" and then implement "searchBarCancelButtonClicked" method
searchBar.showsCancelButton = true
. –
Actinal 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
}
}
© 2022 - 2024 — McMap. All rights reserved.