[英]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.