6

我正在调试我的代码,searchBarTextDidBeginEditing:每次点击搜索栏(位于导航栏中)时,都会调用 UISearchBar 的委托方法两次。

奇怪的是,只有这个委托方法被调用了两次。其他的在整个过程中只被调用一次,这是正确的行为。

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
{
    // called only once
    return YES;
}

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
    // called twice every time
    [searchBar setShowsCancelButton:YES animated:YES];
}

- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar
{
    // called only once
    [searchBar setShowsCancelButton:NO animated:YES];    
    return YES;
}

- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar
{
    // called only once        
}

知道有什么问题吗?

UISeachrBar 在 Storyboard 中设置,具有正确连接的插座,尽管它没有添加到任何视图中,并且在特定视图控制器viewDidLoad中是以下行,将搜索栏添加到导航栏:

self.searchDisplayController.displaysSearchBarInNavigationBar = YES;

我正在使用 Xcode 5.0.1 并在 iOS 7.0.3 模拟器中运行代码。

4

4 回答 4

2

我遇到了同样的问题,并且挖得更深了。

在我的例子中,我有一个子类,UISearchDisplayController它的作用是UISearchDisplayDelegate为自己和UISearchBarDelegate它的UISearchBar.

事实证明,问题在于UISearchDisplayController implements the following methods that collide with theUISearchBarDelegate 协议:

- (void)searchBar:(id)arg1 textDidChange:(id)arg2;
- (void)searchBarCancelButtonClicked:(id)arg1;
- (void)searchBarResultsListButtonClicked:(id)arg1;
- (void)searchBarSearchButtonClicked:(id)arg1;
- (void)searchBarTextDidBeginEditing:(id)arg1;

这意味着如果您创建UISearchDisplayController自己的委托UISearchBar,这些方法将被调用两次。

于 2014-04-17T14:28:22.407 回答
0

我发现如果您取消设置 searchBar 委托并仅保留 searchDisplayController 委托,则根本不会再调用该方法。所以我能想出的唯一解决方法是把它放在你的 searchBarTextDidBeginEditing 和 searchBarTextDidEndEditing 的开头。

static NSDate *lastInvocation;

if ([[NSDate date] timeIntervalSinceDate:lastInvocation] < 0.1f) {
    lastInvocation = [NSDate date];
    return;
} else {
    lastInvocation = [NSDate date];
}
于 2014-10-29T09:58:43.240 回答
0

我找到了这个解决方案: [searchBar setShowsCancelButton:NO animated:YES]; [searchBar resignFirstResponder]; 但有趣的是,我在经过两轮测试后将其删除,代码只调用了一次,而不是两次

于 2015-07-22T02:17:00.870 回答
0

我遇到了 searchBarSearchButtonClicked 的问题:方法被调用了两次。通过调用 [searchBar resignFirstResponder] 解决了问题;

    #pragma mark - UISearchViewDelegate methods
    - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
     // Do things
     [searchBar resignFirstResponder];
    }
于 2016-08-09T22:13:53.273 回答