如何处理按下“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
方法。相反,当键盘的删除按钮被点击时,该方法会被调用。
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)
}
如 Apple 文档 所述,UITextFieldDelegate
中有一个委托方法 textFieldShouldClear(_:)
。
当用户按下内置的“清除”按钮时,文本字段会调用此方法。
因此
UITextFieldDelegate
协议searchBar
的文本字段的代理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
}
}
在 Swift 5.0 中的最简单解决方案:
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchText.isEmpty {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
searchBar.resignFirstResponder()
}
}
}
UISearchController
的搜索控制器中,我添加了对UITextFieldDelegate
的遵循。
然后在init方法中添加了以下行:searchBar.searchTextField.delegate = self
并实现
func textFieldShouldClear(_ textField: UITextField) -> Bool
允许获取清除按钮被按下的信息。
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
会被调用两次,也可以参见this。- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
if (![searchText isEqualToString:self.searchText]) {
self.searchText = searchText;
return;
}
NSLog(@"Clear clicked");
}
这解决了我的问题。
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
}
}
我认为这个问题最简单的解决方案是:
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if searchText.isEmpty {
DispatchQueue.main.async {
searchBar.resignFirstResponder()
}
}
-(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...
}