Создание UISearchDisplayController программно - PullRequest
11 голосов
/ 02 января 2012

Я пытаюсь создать 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.

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

1 Ответ

13 голосов
/ 20 января 2012

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

Репо здесь: https://github.com/JayMarshal/Grabcasts

Это расширенная версия coredatatableviewcontroller курсов Stanford для 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 TVC, по-видимому, обнаружена ошибка, которая не сохраняется в цикле выполнения.Подано как: http://openradar.appspot.com/10254897 также упоминается в SO, см. UIViewController не сохраняет созданный программным способом UISearchDisplayController

...