簡體   English   中英

UISearchBar檢測用戶何時停止類型並且不立即搜索,因此檢測暫停

[英]UISearchBar detect when user stop type and don't search immediately so detect pause

我正在搜索實現一個從網址檢索信息的UISearchbar,並使用默認方法:

 - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{

我可以立即檢測文本何時更改並執行url的獲取,但是這樣,文本類型很慢,因為iPhone正在搜索url,所以我想在用戶停止寫入時開始獲取url第二,所以我想檢測打字的暫停,以刷新通過網址檢索信息的表格視圖。 我找到了這個請求的舊帖子,我嘗試了一個解決方案,對我來說不起作用:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(request:)     object:searchText];

    //.....

    [self performSelector:@selector(request:) withObject:searchText afterDelay:1.5];
}

-(void)request:(NSString *)myString
{
    NSLog(@"%@",myString);
}

這樣當我正在鍵入請求方法時,我沒有調用,但是當我停止輸入時,我為每個輸入的字符調用它,所以默認方法是一樣的,我錯了什么? 或者實施不正確?

看起來提供的解決方案不起作用,因為cancelPreviousPerformRequestsWithTarget:selector:object:cancelPreviousPerformRequestsWithTarget:selector:object: ”參數cancelPreviousPerformRequestsWithTarget:selector:object:與上一次調用performSelector:withObject:afterDelay:的“searchText”參數不匹配performSelector:withObject:afterDelay: ; 因此,延遲搜索會在每次文本更改時排隊,並且永遠不會取消。

您可以使用NSTimer來延遲搜索的調用,並在文本更改時取消計時器:為對象提供NSTimer屬性或字段; searchBar:textDidChange:取消任何現有的計時器,然后創建並計划一個新的計時器。 計時器的目標應該調用您的搜索方法。

像(在我頭頂)的東西:

// in your class' .h object fields
{
  ...
  NSTimer *searchDelayer; // this will be a weak ref, but adding "[searchDelayer invalidate], searchDelayer=nil;" to dealloc wouldn't hurt
  ...
}

// in the .m

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
  [searchDelayer invalidate], searchDelayer=nil;
  if (YES /* ...or whatever validity test you want to apply */)
    searchDelayer = [NSTimer scheduledTimerWithTimeInterval:1.5
                                                     target:self
                                                   selector:@selector(doDelayedSearch:)
                                                   userInfo:searchText
                                                    repeats:NO];
}

-(void)doDelayedSearch:(NSTimer *)t
{
  assert(t == searchDelayer);
  [self request:searchDelayer.userInfo];
  searchDelayer = nil; // important because the timer is about to release and dealloc itself
}

一些程序員可能不像我在這里那樣對弱引用更不習慣。

[編輯添加:]

如果你設置使用cancelPreviousPerformRequestsWithTarget ......,你可以這樣做:

// in your class' .h object fields
{
  ...
  NSString *priorSearchText; // this will NOT be a weak ref, so adding "[priorSearchText release]" to dealloc is also required
  ...
}

// in the .m
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
  [NSObject cancelPreviousPerformRequestsWithTarget:self
                                           selector:@selector(request:)
                                             object:priorSearchText];
  [priorSearchText release], priorSearchText = [searchText retain];
  if (YES /* ...or whatever validity test you want to apply */)
    [self performSelector:@selector(request:)
               withObject:searchText
               afterDelay:1.5];
}

我不認為我曾經使用過cancelPreviousPerformRequestsWithTarget:...是真的,所以我不知道它是否隱藏任何意外。 如果您遇到問題,請添加NSLog,查找延遲搜索但不應取消。

移動這一行: [self performSelector:@selector(request:) withObject:searchText afterDelay:1.5]; 你的textDidChange方法,並把它放在文本中開始編輯方法: - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM