2

次のように searchDisplayController と searchBar を設定しました。

UISearchBar *aSearchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 150, 44)];
self.reportSearchBar = aSearchBar;
_reportSearchBar.tintColor = DARKGRAY_COLOR;
_reportSearchBar.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;
_reportSearchBar.delegate = self;
[aSearchBar release];

UISearchDisplayController *searchDisplayCtlr = [[UISearchDisplayController alloc] initWithSearchBar:self.reportSearchBar contentsController:self];
self.reportSearchDisplayController = searchDisplayCtlr;
self.reportSearchDisplayController.searchResultsDataSource = self;
self.reportSearchDisplayController.searchResultsDelegate = self;
[searchDisplayCtlr release];

UIBarButtonItem *searchBBI = [[UIBarButtonItem alloc] initWithCustomView:_reportSearchBar];
self.reportSearchBBI = searchBBI;
[searchBBI release];

[self.navigationItem setRightBarButtonItem:_reportSearchBBI animated:NO];

念のため、ViewController がクラスに準拠しているかどうかを確認しました。

if ([self conformsToProtocol:@protocol(UISearchDisplayDelegate)]) {
    NSLog(@"conform to search display");
}

私のViewController .hファイルには次のものがあります:

<UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate, UISearchDisplayDelegate>

ただし、ブレークポイントを設定しました

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
    [self filterContentForSearchText:searchString];

    return YES;
}

そして、それは決してそこに到達しません。UISearBarDelegate メソッドの 1 つを実装すると、そのメソッドに到達します。Apple のサンプル コード TableSearch を実行すると、上でコピーした searchDisplayController デリゲート メソッドが実行されます。私の場合、検索バーにテキストを入力しようとすると、searchDisplayController デリゲートが呼び出されないため、フィルター処理されたリストにオブジェクトが含まれていないため、アプリがクラッシュします。

考え?ありがとう!

4

2 に答える 2

2

私はちょうどアップルリファレンスで見ます:

searchController = [[UISearchDisplayController alloc]
                     initWithSearchBar:searchBar contentsController:self];
searchController.delegate = self;
searchController.searchResultsDataSource = self;
searchController.searchResultsDelegate = self;

コードにsearchController.delegate=selfが表示されませんが、それは必須ではありませんか?

http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UISearchDisplayController_Class/Reference/Reference.html

于 2012-08-17T15:35:42.710 に答える
1

ヘッダー ファイルで UISearchDisplayController の iVar を必ず作成してください。

以下を使用して UISearchDisplayController を作成する場合:

UISearchDisplayController* searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchField contentsController:self];

ARCによってリリースされ、デリゲートメソッドは呼び出されず、self.searchDisplayController(UIViewControllerのプロパティ)を呼び出すと、 nil.

したがって、修正は次のとおりです。ヘッダー(.h)ファイルで:

@interface MenuViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate, UISearchDisplayDelegate> {
        UISearchDisplayController* searchDisplayController;
        UISearchBar *searchField;
        UITableView* tableView;
        NSArray* searchResults;
}

および実装 (.m) ファイルで:

searchField = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 49)];
searchField.delegate = self;

searchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:searchField contentsController:self];
searchDisplayController.delegate = self;
searchDisplayController.searchResultsDataSource = self;
searchDisplayController.searchResultsDelegate = self;

tableView.tableHeaderView = searchField;
tableView.contentOffset = CGPointMake(0, searchField.frame.size.height);

そのように実装すると、コードの残りの部分でself.searchDisplayControllerとの両方を呼び出すことができます。searchDisplayController

于 2013-06-09T14:54:10.913 に答える