2011-12-05 5 views
1

UISearchBarのテキストを変更したいが、performSearchを呼びたくない。セレクタを2つの方法でキャンセルできました。セレクタをキャンセルする必要があります。セレクタをキャンセルしたことを100%保証していますか?

最初の方法: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; 
} 

を使用して、私はfunc1の中でセレクタをキャンセルし、100%の保証を持っていますよ? func2は良いですか?

更新:self.searchBar.text = @"";またはself.searchBar.text = @"Restaurants";以外の汎用ソリューションを探しています。

+0

searchBarでsearchTextが空であるかどうかをチェックしない理由:textDidChange :?あなたはセレクタperformSearchを呼び出す必要はありません。 – ian

答えて

3

最初のメソッドは非常に複雑で、メソッドを呼び出してキャンセルしようとしています。キャンセルが適切なタイミングで到着しない場合、メソッドが呼び出されます。だからこそ、アプリが成長し、状況がより複雑になるなら、それは悪夢です。

もう少し頑強で、デリゲートを削除しています。それで、デリゲートが呼び出されないように、デリゲートが呼び出されないことが保証されています。しかし、iOSは、あなたが扱いたいかもしれない他のものについて代理人に電話することもできません。それ以外に。結果を返すデリゲートがない場合、iOSはすべての結果を削除すると思うので、デバイスでこれをテストする必要があります。しかし、これは検索の他の部分をどのように実装したかによって異なります。

私のアドバイス:UISearchDisplayDelegateプロトコルからsearchDisplayController:shouldReloadTableForSearchString:メソッドを実装してください。この方法では、検索バーで検索結果で表をリロードするかどうかを制御できます。検索文字列を変更する直前にフラグを設定するので、このメソッドは何を返すかを指定しません。

例の擬似コード:あなたのコードによって行われ、検索文字列の変更を無視していますが、ユーザーが行った変更を尊重し

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; 
} 

この方法です。もちろんsearchBar:textDidChange:メソッドのように別の関数のignoreChangesブール値にチェックを入れることも可能です。

幸運を祈る!

0

質問に答えるには:はい。私はcancelPreviousPerformRequestsWithTargetに問題はありませんでした:それはやるべきことをやっていません。

しかし、私はメッセージを投稿したり取り消したりするのではなく、ignoreChangesのアプローチに傾いています。

関連する問題