2012-01-18 2 views
1

У меня есть UITableViewController, и я хочу добавить UISearchBarController вверху, чтобы он выполнял поиск в другом представлении таблицы (а не в табличном представлении UITableViewController).Добавить UISearchBarController в UITableViewController без IB

Как я могу инициализировать это с помощью кода и без IB?

@interface mySearchController : UITableViewController <UISearchDisplayDelegate, UISearchBarDelegate> 

@property (nonatomic, retain) UISearchDisplayController *aSearchBarController; 
@property (nonatomic, retain) UISearchBar *aSearchBar; 

@end 

- (id)init { 
    if ((self = [super init])) { 

     UISearchBar *tempSearchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 0)]; 
     self.aSearchBar = tempSearchBar; 
     self.aSearchBar.delegate = self; 
     [self.aSearchBar sizeToFit]; 
     self.tableView.tableHeaderView = self.aSearchBar; 
     [self.aSearchBar release]; 

     UISearchDisplayController *tempSearchDisplayController = [[UISearchDisplayController alloc] initWithSearchBar:aSearchBar contentsController:self]; 
     self.searchDisplayController = tempSearchDisplayController; 
     self.searchDisplayController.delegate = self; 
     self.searchDisplayController.searchResultsDataSource = self; 
     self.searchDisplayController.searchResultsDelegate = self; 
    } 
    return self; 
} 

- (id)initWithStyle:(UITableViewStyle)style { 
    self = [super initWithStyle:UITableViewStyleGrouped]; 
    if (self) { 
     // Custom initialization. 
    } 
    return self; 
} 

enter image description here

ответ

3

Беглый взгляд на UISearchDisplayController Class Reference ответит на ваш вопрос.

«Обычно вы инициализировать контроллер поиска дисплея от контроллера вида (как правило, например, из UITableViewController), что это отображения списка. Для выполнения конфигурации программно установить self для контроллера представления и результатов поиска данных дисплейного контроллера поискового запроса источника и делегата ».

Так оно и должно выглядеть следующим образом:

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

Если вы будете следовать этому образцу, то в методах вид таблицы исходных данных и делегата вы можете проверить вид таблицы аргумент методов, чтобы определить, какой вид таблицы отправляет сообщение:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if (tableView == self.tableView) 
    { 
     return ...; 
    } 

    // If necessary (if self is the data source for other table views), 
    // check whether tableView is searchController.searchResultsTableView. 
    return ...; 
} 
+0

Спасибо, я добавил код на вопрос. Правильно ли я это делаю? – Jon

+0

Все выглядит правильно, за исключением того, что я бы выполнил настройку в '-viewDidLoad', чтобы гарантировать, что табличное представление, которое вы добавляете в него, не равно нулю. Кроме того, вам не нужно назначать 'self.searchDisplayController', поскольку он обрабатывается' initWithSearchBar: contentController: '. Контроллер, переданный в 'contentController', автоматически получит свой набор' searchDisplayController'. –

+0

Теперь я уверен, что должен выглядеть мой IB, я решил сделать это в IB. По сути, у меня есть таблица с четырьмя строками, каждая из четырех строковых функций - как фильтр для поиска. При нажатии кнопки 4 строки имеют галочку. Затем при поиске вы увидите результаты. У меня все работает, кроме обновления таблицы после поиска. Можете ли вы сказать мне, если я на правильном пути? Я загрузил pic выше макета IB-файла. – Jon

0

Вы должны смотреть через here.

Если этот вопрос уже задан и дан ответ. Надеюсь, это поможет.

Смежные вопросы