我想更改UISearchBar中的文本,但我不想调用performSearch。我可以用两种方式取消选择器。
第一种方式:我正在使用方法func1。
@property (nonatomic, retain) IBOutlet UISearchBar *searchBar;
-(void) func1
{
self.searchBar.delegate = self;
self.searchBar.text = @"";
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(performSearch:) object:nil];
}
- (void)searchBar:(UISearchBar *)searchBar_ textDidChange:(NSString *)searchText
{
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(performSearch:) object:nil];
[self performSelector:@selector(performSearch:) withObject:nil afterDelay:1];
}
第二种方式:我正在使用func2
-(void) func2
{
self.searchBar.delegate = nil;
self.searchBar.text = @"";
self.searchBar.delegate = self;
}
我是否100%保证我取消了func1中的选择器? func2更好吗?
更新:我正在寻找通用解决方案,而不仅仅是self.searchBar.text = @"";
或self.searchBar.text = @"Restaurants";
。
答案 0 :(得分:3)
第一种方法非常复杂,您正在调用方法并尝试取消它们。如果取消未在正确的时间到达,则将调用该方法。因此,如果应用程序增长并且情况变得更加复杂,那么不要这样做是一场噩梦。
第二个解决方案更强大,您正在删除委托。所以它保证代理不会被调用,因为它不在那里。但是iOS也无法为您想要处理的其他事情调用委托。除此之外;您应该在设备上测试它,因为我认为当没有返回任何结果的委托时,iOS将删除所有结果。但这取决于您如何实施搜索的其他部分。
我的建议:从searchDisplayController:shouldReloadTableForSearchString:
协议实施UISearchDisplayDelegate
方法。通过此方法,您可以控制搜索栏是否应使用搜索结果重新加载表。在您更改搜索字符串之前,您自己设置一个标志,因此此方法会在何时返回内容。
伪代码示例:
BOOL ignoreChanges = NO;
-(void)editSearchString
{
ignoreChanges = YES;
self.searchBar.text = @"some_string";
}
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
BOOL shouldReload = !ignoreChanges;
ignoreChanges = NO;
return shouldReload;
}
这样您可以忽略代码完成的搜索字符串更改,但您将尊重用户所做的更改。当然可以将检查放在另一个函数中的ignoreChanges
布尔值上,如searchBar:textDidChange:
方法,如果这比我的建议更适合你的需要!
答案 1 :(得分:0)
答案 2 :(得分:0)
回答你所说的问题:是的。我从来没有遇到过cancelPreviousPerformRequestsWithTarget的问题:没做它应该做的事情。
但我倾向于ignoreChanges方法,而不是发布和取消消息。