按下Uisearchbar x按钮

Fab*_*bio 17 xcode delegates uisearchbar ios

按'x'按钮时如何处理事件?

我尝试这种方法但不起作用.

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

}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Eri*_*son 25

我认为没有一种简单的方法来挂钩X按钮.

但是,您可以直接考虑其结果:清除文本.

试试这个:

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
    if searchText == "" {
        print("UISearchBar.text cleared!")
    }
}
Run Code Online (Sandbox Code Playgroud)

副作用是当您手动清除文本时也会调用它.

  • 更为准确的描述是,使用此方法来检测清除按钮的按下是不正确的。这些年来,我不敢相信苹果没有解决这个问题。 (3认同)

Ked*_*kar 11

斯威夫特 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)
}
Run Code Online (Sandbox Code Playgroud)

  • 这依赖于键路径“_clearButton”,如果苹果决定将来更改此键,这将停止工作。 (2认同)
  • 这必须是最佳答案!谢谢基达尔 (2认同)

eja*_*a08 11

正如Apple 文档textFieldShouldClear(_:)中所述UITextFieldDelegate,.

文本字段调用此方法来响应用户按下内置清除按钮。

所以

  1. 符合UITextFieldDelegate
  2. searchBar设置您的文本字段的委托
  3. 实施textFieldShouldClear(_:)方法
class 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
    }
}
Run Code Online (Sandbox Code Playgroud)


fun*_*ct7 10

一个相当hacky的方式,但这是有效的.

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
}
Run Code Online (Sandbox Code Playgroud)

此代码的成功取决于点击搜索栏的清除按钮时searchBar(_:shouldChangeTextIn:replacementText:) -> Bool未调用的事实.相反,当点击键盘的删除按钮时,调用该方法.


小智 7

Swift 5.0 中最简单的解决方案

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    if searchText.isEmpty {
        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
            searchBar.resignFirstResponder()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 4

我遇到了同样的问题,尝试通过访问 searchBar 的子视图 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");
}
Run Code Online (Sandbox Code Playgroud)

这解决了我的问题。