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