我需要取消一个选择器。我是否100%保证取消选择器?

时间:2011-12-05 11:21:13

标签: ios selector uisearchbar

我想更改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";

3 个答案:

答案 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)

尝试查找Subclassing NSOperation to be concurrent and cancellable

BJ Homer 答案,解释如何解决它

希望它可以帮到你!

答案 2 :(得分:0)

回答你所说的问题:是的。我从来没有遇到过cancelPreviousPerformRequestsWithTarget的问题:没做它应该做的事情。

但我倾向于ignoreChanges方法,而不是发布和取消消息。