searchBarTextDidBeginEditing委托方法调用两次

时间:2013-11-10 13:29:57

标签: ios iphone objective-c cocoa-touch ios7

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

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

- (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是将搜索栏添加到导航栏的以下行: / p>

self.searchDisplayController.displaysSearchBarInNavigationBar = YES;

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

4 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,并且深入挖掘了一下。

就我而言,我有一个UISearchDisplayController的子类,其自身为UISearchDisplayDelegateUISearchBarDelegateUISearchBar

事实证明,问题是UISearchDisplayController implements the following methods that collide with the UISearchBarDelegate`协议:

- (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的委托,则会调用这些方法两次。

答案 1 :(得分:0)

我发现如果取消设置searchBar委托并且只保留searchDisplayController委托,则不再调用该方法。所以我能提出的唯一解决方法是将它放在searchBarTextDidBeginEditing和searchBarTextDidEndEditing的开头。

static NSDate *lastInvocation;

if ([[NSDate date] timeIntervalSinceDate:lastInvocation] < 0.1f) {
    lastInvocation = [NSDate date];
    return;
} else {
    lastInvocation = [NSDate date];
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

解决了问题
$grouped