2012-01-01 1 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]; 
} 

я называю выше метод в -viewDidLoad методе моих подклассов UITableViewController. К сожалению, ничего не происходит, когда мой контроллер просмотра таблицы отображается в UITabBarController.

Любая помощь была бы принята с благодарностью.

ответ

12

Заканчивать пример кода в: [ https://github.com/JayMarshal/GrabCasts.com-iPhone-Client/blob/master/CoreDataTableViewController.m][1]

Repo здесь: https://github.com/JayMarshal/Grabcasts

Это расширенная версия coredatatableviewcontroller курсов Стэнфорд IOS.

Соответствующий фрагмент этого кода следующим образом:

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

В основном это придает UISearchDisplayController к себе (который должен быть tableviewcontroller) в качестве побочного эффекта инициализации. Так установка:

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

Вместо

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

может сделать трюк. В отладке проверьте, указывают ли myCon и self.searchDisplayController на один и тот же объект?

Обновлено: похоже, в свойстве SDC для ТВС есть ошибка, что он не сохраняется в runloop. Подано в качестве: http://openradar.appspot.com/10254897, также упомянутое на SO, см. UIViewController does not retain its programmatically-created UISearchDisplayController

+1

Из документа doc, on contentsController: «Обычно это экземпляр UITableViewController». Как правило, не требуется. –

+0

Итак, если вы не хотите использовать 'UITableViewController', вы можете просто иметь' UIViewController', который соответствует протоколам 'UITableViewDataSource' и' UITableViewDelegate'. –

+6

Моя проблема заключается в том, что 'self.searchDisplayController' является свойством readonly в' UITableViewController', и все же код здесь устанавливает его. –