SearchBar в табличном представлении с searchDisplayController программно без редактирования

Я пытаюсь создать представление таблицы с панелью поиска внутри представления заголовка таблицы. Я хотел бы использовать searchDisplayController для управления всем. Я создал все программно (мне не нравится IB), пытаясь установить все правильные свойства, но мне кажется, что я чего-то упускаю, потому что, когда появляется таблица, я не могу редактировать текст в панель поиска и посмотрите любую анимацию. Вот часть кода:

- (void)viewDidLoad {
    [super viewDidLoad];
    UISearchBar *searchBarTMP=[[UISearchBar alloc]init];
    self.searchBar=searchBarTMP;
    [searchBarTMP release];
    self.searchBar.autocapitalizationType=UITextAutocapitalizationTypeNone;
    self.searchBar.delegate=self;
    self.searchBar.showsScopeBar=YES;
    self.searchBar.keyboardType=UIKeyboardTypeDefault;
    self.searchBar.userInteractionEnabled=YES;
    self.searchBar.multipleTouchEnabled=YES;

    self.searchBar.scopeButtonTitles=[NSArray arrayWithObjects:NSLocalizedString(@"City",@"Scope City"),NSLocalizedString(@"Postal Code",@"Scope PostalCode"),nil];
    self.tableView.tableHeaderView=searchBar;
    self.searchBar.selectedScopeButtonIndex=0;
    self.navigationItem.title=NSLocalizedString(@"Store",@"Table title");

    //SearchDisplayController creation
    UISearchDisplayController *searchDisplayControllerTMP = [[UISearchDisplayController alloc] initWithSearchBar:self.searchBar contentsController:self];
    self.searchDisplayController=searchDisplayControllerTMP;
    [searchDisplayControllerTMP release];
    self.searchDisplayController.delegate=self;
    self.searchDisplayController.searchResultsDelegate=self;
    self.searchDisplayController.searchResultsDataSource=self;  

    //....continue
}

Я знаю, что когда вы используете только панель поиска, вы должны иметь дело с ее протоколом делегата, но я предполагаю, что searchDisplayController управляет вами, как показано в примере кода Apple. (наращивать с помощью IB).

Любое предложение? Спасибо, Андреа


person Andrea    schedule 07.01.2011    source источник


Ответы (2)


Нашел ... После вставки в заголовок представления таблицы надо написать

[self.searchBar sizeToFit];
person Andrea    schedule 07.01.2011

Если вы используете ARC, убедитесь, что вы создали iVar для UISearchDisplayController в файле заголовка.

Если вы создаете 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 в остальной части вашего кода.

person Almog C    schedule 09.06.2013