Ios UISearchBar x按钮按下

Ios UISearchBar x按钮按下,ios,xcode,delegates,uisearchbar,Ios,Xcode,Delegates,Uisearchbar,按下“x”按钮时如何处理事件 我试过这个方法,但不管用 -(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{ } 我也遇到了同样的问题,试图通过访问搜索栏的子视图文本字段来解决,但它导致了我的应用程序崩溃,最后我发现了这个问题 另一个问题是, -(无效)搜索栏:(UISearchBar*)搜索栏文本更改:(NSString*)搜索文本 单击“取消”按钮时将调用两次,另请参见 最后,我做的是 - (void)searchBa

按下“x”按钮时如何处理事件

我试过这个方法,但不管用

-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{

}

我也遇到了同样的问题,试图通过访问搜索栏的子视图文本字段来解决,但它导致了我的应用程序崩溃,最后我发现了这个问题

另一个问题是,

-(无效)搜索栏:(UISearchBar*)搜索栏文本更改:(NSString*)搜索文本

单击“取消”按钮时将调用两次,另请参见

最后,我做的是

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    if (![searchText isEqualToString:self.searchText]) {
        self.searchText = searchText;
        return;
    }
    NSLog(@"Clear clicked");
}

这解决了我的问题。

我认为没有一种简单的方法可以挂接X按钮

然而,您可以钩住它的直接后果:清除文本

试试这个:

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
    if searchText == "" {
        print("UISearchBar.text cleared!")
    }
}
副作用是,当您手动清除文本时,也会调用它。

您可以按照“UISearchBarDeleteGate”连接到“Cancel button”单击事件,然后实现“searchBarCancelButtonClicked”方法。

这对我很有效

-(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...
}

这是一种相当老套的方法,但它是有效的

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(u3;:shouldChangeTextIn:replacementText:)->Bool
。相反,当点击键盘的删除按钮时,将调用该方法。

。。。只是工作而已

- (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 searchBarShouldBeginEditing(_ searchBar: UISearchBar) -> Bool {
}

Swift 5.2,Xcode 11.4

这个对我有用

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)
}

我认为解决这个问题最简单的办法是:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
     if searchText.isEmpty {
             DispatchQueue.main.async {
                 searchBar.resignFirstResponder()
             }
 }

直到苹果发布一个合适的委托方法来清除按钮事件处理,这将从Xcode 12起生效要求:>=iOS13

如果可能,获取对搜索栏
clearButton
的引用

斯威夫特:

extension UISearchTextField {
   var clearButton: UIButton? {
      return value(forKey: "_clearButton") as? UIButton
   }
}
searchBar.searchTextField.clearButton.addTarget(self, #selector(handler), .touchUpInside) //bllah

请记住,您的“action-
searchTextFieldClearButtonTapHandler
”最后一次调用是非常重要的。也就是说,在委托方法
-(void)searchBar:(UISearchBar*)searchBar text didchange:(NSString*)searchText

之后,您可以添加分配搜索栏的代码吗?签出帖子我尝试过使用该代码,但在ios 8Nope中不起作用,“取消”按钮是另一个按钮,在设置
搜索栏时显示。showsCancelButton=true
。取消按钮不同,“x”按钮不同。在发布之前,您是否检查了“searchBarCancelButtonClicked”方法是否在单击“x”按钮时触发?更准确的描述是,使用此方法检测是否按下了清晰的按钮是一种黑客行为。我不敢相信苹果这么多年都没有解决这个问题。如果它不起作用,那就加上uu应该做。也就是说:(searchBar:UISearchBar,textDidChange searchText:String)这不是真的。这是点击搜索栏时调用的第一个方法,但点击交叉按钮时不会调用。你是对的,甚至我都不相信,但我使用的是uicollectionview中的searcontroller搜索栏,这样做非常复杂。因此,我认为在刷新collectionview时,出于某种原因,searchbar正在成为第一个响应者,在这种情况下,如果设置了searchcontroller的搜索栏委托,则应该首先调用begin。我应该提一下。我稍后会删除它。感谢您阅读标题中的文档(无效)搜索栏:(UISearchBar*)搜索栏文本更改:(NSString*)搜索文本;//当文本更改(包括清除)黑客攻击时调用?苹果从未意识到人们会想要点击该X?当按下X时,不会调用shouldChangeTextIn该在哪里使用该代码?我已经尝试清除文本字段好几天了@Guilhermacrozariol,你可以把这段代码放在任何地方,比如viewDidLoad()等等。这对我来说很好,谢谢!这取决于keypath“\u clearButton”如果苹果决定在将来更改此键,这将停止工作。是的。。。在此之前,可能会直接公开button属性。
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)
}
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
     if searchText.isEmpty {
             DispatchQueue.main.async {
                 searchBar.resignFirstResponder()
             }
 }
UIButton *searchBarTextFieldClearButton = [self.searchBar.searchTextField valueForKey:@"_clearButton"];
if (searchBarTextFieldClearButton) {
    [searchBarTextFieldClearButton addTarget:self action:@selector(searchTextFieldClearButtonTapHandler) forControlEvents:UIControlEventTouchUpInside];
}
extension UISearchTextField {
   var clearButton: UIButton? {
      return value(forKey: "_clearButton") as? UIButton
   }
}
searchBar.searchTextField.clearButton.addTarget(self, #selector(handler), .touchUpInside) //bllah