我正在调试我的代码,每次点击搜索栏(位于导航栏中)时,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模拟器中运行代码。
答案 0 :(得分:2)
我遇到了同样的问题,并且深入挖掘了一下。
就我而言,我有一个UISearchDisplayController
的子类,其自身为UISearchDisplayDelegate
,UISearchBarDelegate
为UISearchBar
。
事实证明,问题是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