2012-01-01 5 views
11

プログラムでUISearchDisplayControllerを作成しようとしています。私は検索コントローラを設定する方法がありますが、私はそれを呼び出すと何も起こりません。プログラムでUISearchDisplayControllerを作成する

この私の-setupSearch方法:

- (void)setupSearch { 
    UISearchBar *myBar; 
    UISearchDisplayController *myCon; 

    myBar = [[UISearchBar alloc] initWithFrame:CGRectZero]; 
    [myBar sizeToFit]; 

    myCon = [[UISearchDisplayController alloc] 
      initWithSearchBar:myBar contentsController:self]; 
    [myBar release]; 

    myCon.delegate = self; 
    myCon.searchResultsDataSource = self; 
    myCon.searchResultsDelegate = self; 

    /* Setup scopes */ 
    { 
     NSMutableArray *scopes; 
     NSUInteger count, i; 
     NSString *aScope; 

     count = SCOPE_COUNT; 
     scopes = [[NSMutableArray alloc] initWithCapacity:count]; 
     for(i = 0; i < count; i++) { 
      // I create four scopes here 
     } 

     myCon.searchBar.scopeButtonTitles = scopes; 
     [scopes release]; 
    } 

    [myCon release]; 
} 

私は私のサブクラスUITableViewController-viewDidLoad方法で上記のメソッドを呼び出します。残念ながら、私のテーブルビューコントローラがUITabBarControllerに表示されても何も起こりません。

ご協力いただければ幸いです。

答えて

12

例のコードをチェックアウト中:ここ [ https://github.com/JayMarshal/GrabCasts.com-iPhone-Client/blob/master/CoreDataTableViewController.m][1]

レポ:https://github.com/JayMarshal/Grabcasts

これは、スタンフォード大学のiOSコースのcoredatatableviewcontrollerの拡張バージョンです。そのコードの

関連するスニペットは、以下:

- (void)createSearchBar { 
if (self.searchKey.length) { 
    if (self.tableView && !self.tableView.tableHeaderView) { 
     UISearchBar *searchBar = [[[UISearchBar alloc] init] autorelease]; 
     self.searchDisplayController 
       = [[UISearchDisplayController alloc] initWithSearchBar:searchBar 
                contentsController:self]; 
     self.searchDisplayController.searchResultsDelegate = self; 
     self.searchDisplayController.searchResultsDataSource = self; 
     self.searchDisplayController.delegate = self; 
     searchBar.frame = CGRectMake(0, 0, 0, 38); 
     self.tableView.tableHeaderView = searchBar; 
    } 
} else { 
    self.tableView.tableHeaderView = nil; 
} 

は、基本的には初期の副作用として(tableviewcontrollerなければならない)、自己にUISearchDisplayControllerを添付する。だから、設定:

self.searchDisplayController.searchResultsDelegate = self; 
self.searchDisplayController.searchResultsDataSource = self; 

代わり

myCon.searchResultsDataSource = self; 
myCon.searchResultsDelegate = self; 

のトリックを行う可能性があります。デバッグでは、myConとself.searchDisplayControllerが同じオブジェクトを指しているかどうかを確認しますか?

更新:TVCのSDCプロパティにrunloopに保持されていないバグがあるようです。提出先:http://openradar.appspot.com/10254897 SOにも記載されています。 UIViewController does not retain its programmatically-created UISearchDisplayController

+1

doc:contentsController: "これは通常、UITableViewControllerのインスタンスです。"通常、必須ではありません。 –

+0

'UITableViewController'を使いたくない場合は、単に' UITableViewDataSource'と 'UITableViewDelegate'に従う' UIViewController'を持つことができます。 –

+6

これは私の問題は、 'self.searchDisplayController'は' UITableViewController'の読み取り専用プロパティであり、ここでのコードはそれを設定しているということです。 –

関連する問題