搜索栏取消按钮点击的委托方法没有被调用,有什么办法可以调用吗?

25

UIViewController用于实现一个视图来放置一个UITableView和UISearchBar,但是无法调用searchBarCancelButtonClicked方法。不知道原因。


1
我有完全相同的问题。我的视图控制器是搜索栏的代理,并采用了 UISearchBarDelegate 协议。 - Adam Crume
1
我也有同样的问题。一切都应该设置正确了。所有其他委托方法都被调用了,但这个没有。如果能找到原因,我会很高兴的。 - Petar
1
看看这个问题。它帮了我很多。https://dev59.com/qG025IYBdhLWcg3wblg3 - derpoliuk
谢谢您,derpoliuk,这就是发生在我身上的事情! - Ferran Maylinch
10个回答

10

searchBarCancelButtonClicked无法触发的原因可能是您的UISearchBar未显示取消按钮。您可以通过以下方式显示取消按钮:

searchBar.showsCancelButton = true

我遇到了同样的问题,让“取消”按钮显示出来后,searchBarCancelButtonClicked 就像预期那样触发了。


8
在我的情况下,我一直点击窗口栏中的X --> 那不是取消按钮。 [我一直以为它是...] 使用这行代码导致单词“取消”显示在我的栏右侧,然后我意识到了我的错误。谢谢! - Mozahler

6
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
   // This method has been called when u enter some text on search or Cancel the search.
   // so make some condition for example:

   if([searchText isEqualToString:@""] || searchText==nil) {
        // Nothing to search, empty result.
        searching = NO;
        [mytableView reloadData];
    }
}

希望这能有所帮助。

我没有看到“取消”按钮调用那个方法... :( - Ferran Maylinch

6

确保您的UIViewController被设置为UISearchBar的代理,并且采用了UISearchBarDelegate协议。


9
就是这样,所有其他委托方法都有效,只有这个没有被调用,可能是SDK的一个bug。 - samiq
@samiq 我似乎也遇到了这个问题。这是在iOS 7中! - Isuru
4
添加了searchController.searchBar.delegate = self并调用了该方法。谢谢。 - Andrés Pizá Bückmann
@Isuru,我也遇到了同样的问题。有解决方案吗? - Shivam Pokhriyal
@ShivamPokhriyal 这是很久以前的事了,我真的不记得我做了什么。抱歉。 - Isuru

1

searchController.searchBar.delegate = self,而不是仅仅使用searchController.delegate = self


1

在我的情况下,是由于未受控制的userInteractionEnabled=NO。


1
我的真正原因是我认为小的x按钮是取消按钮,但实际上它不是...如果你遇到了和我一样的问题,请使用以下代码。
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        if searchText.isEmpty {
            searchRecords.removeAll()
            searchTableView.reloadData()
        }
    }

0

这行代码可以移除 UISearchController 的透明视图

let searchController = UISearchController(searchResultsController: nil)
searchController.dimsBackgroundDuringPresentation = false

0
尝试将这个放在viewDidLoad方法里。在我的情况下,有时候取消按钮的动作代理“searchBarCancelButtonClicked”被触发,有时候没有(只是键盘消失了,取消按钮变得不活跃),在添加这个之后,一切都开始按预期工作。
UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]).isEnabled = true

0

Swift 4.2

我曾经遇到过同样的问题,必须在 searchBarCancelButtonClicked 方法之前将 definesPresentationContext 属性设置为 true 才能正常工作。

 definesPresentationContext = true

请解释一下这与问题的关系。 - JJJ
我不知道这与问题有什么关系。但在我的情况下,self.definesPresentationContext = true 的效果非常好。 - Akshay Phulare

-3
我在使用UIScrollView内部有UISearchBar时遇到了同样的问题。根据我的理解,您将其放在UITableView中,它是UIScrollView的子类。
在我的情况下有所帮助的是设置:
tableView.delaysContentTouches = NO;

似乎将searchBarCancelButtonClicked方法设置为默认值YES时无法正常工作。


该方法似乎不存在。 - Ferran Maylinch
我的错,我不小心引用了searchBar而不是UIScrollView子类。它自iOS 2.0以来就存在于那里:https://developer.apple.com/library/ios/documentation/uikit/reference/uiscrollview_class/Reference/UIScrollView.html#//apple_ref/occ/instp/UIScrollView/delaysContentTouches - Dennis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接