6

テーブルビューコントローラーのサブクラスであるテーブルビューと検索バーを持つ親クラスがあります。searchBar と searchdisplaycontroller のデリゲートは、UISearchdisplaycontroller から継承された別のクラスに設定されます。tableview と searchbar のデータソースとデリゲートは、このクラスで個別に処理されます。クラスはARCの下にあります。

したがって、ユーザーが検索をタップすると、コントロールは FilesListController (親) クラスからこのクラスに転送されます。ここで、ユーザーがキャンセル ボタンをタップすると、このクラスに設定された検索バー デリゲート、つまり

- (void)searchBarCancelButtonClicked:(UISearchBar *) searchBar  

呼び出されますが、全画面検索テーブルビューを閉じて親ビューコントローラーに戻るという目的には役立ちません。ただし、このデリゲートを検索クラスに記述しなければ、適切に機能します。xib と呼び出し時に検索バーのデリゲートを設定しました。

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar

このような:

self.searchResultsTableView.delegate = self;
self.searchResultsTableView.dataSource = self;
[parentFileViewController.searchDisplayController setDelegate:self];

どこが間違っていますか?前もって感謝します。

4

3 に答える 3

13

SearchBarControllerでUISearchBarを閉じたい場合は、次のコードを使用してください。

[self.searchDisplayController setActive:NO animated:YES];
于 2012-08-27T09:26:56.607 に答える
1

デリゲート関数でレスポンダーの辞任を実装する必要があります。

- (void)searchBarCancelButtonClicked:(UISearchBar *) searchBar {
      [searchBar resignFirstResponder];
 }
于 2012-08-27T09:01:58.977 に答える
-1

メモリの警告は、アプリケーションの実行中にいつでも表示される可能性があります。メモリの警告が発生し、ビューと破棄可能なオブジェクトを再作成する必要があると想定する必要があります。

配列を nil に設定することで、このような状況に対処しています。

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];

if([self isViewLoaded] && self.view.window == nil)
{
    self.view = nil;
    keys = nil;
    names = nil;
    errorDuringNetworkCall = nil;
}
}

そして、セグエ操作を実行する前に検索バーのテーブルビューを閉じることにより:

[self performSegueWithIdentifier:@"navigateToNextScreen" sender:self];
self.searchBar.text = @"";
[self.searchDisplayController setActive:NO animated:YES];

メモリ警告が受信された後、viewDidLoad メソッドが再度呼び出され、配列が設定されます。検索バーは引き続き便利です。問題なく動作します。

于 2014-03-02T17:25:01.473 に答える