Я пытаюсь добавить строку поиска в производный класс UITableViewController программно (у меня нет xib). Когда я нажимаю на строку поиска, таблица становится пустой, и появляется клавиатура. Если я набираю поисковый запрос, сообщения отладки сообщают мне, что фильтр имеет правильное количество записей, но представление остается пустым.UISearchDisplayController не отображает строки
Я объявил UISearchDisplayController в файле .h как: @property (неатомный, сильный) UISearchDisplayController * searchController; Кроме того, я добавил UISearchDisplayDelegate и UISearchBarDelegate в классе def.
Я создал uisearchbar и UISearchDisplayController в viewDidLoad следующим образом:
UISearchBar *theSearchBar = [[UISearchBar alloc] initWithFrame:CGRectZero];
[theSearchBar sizeToFit];
theSearchBar.delegate = self;
theSearchBar.autocorrectionType = UITextAutocorrectionTypeNo;
self.tableView.tableHeaderView = theSearchBar;
self.searchController = [[UISearchDisplayController alloc]
initWithSearchBar:theSearchBar
contentsController:self];
self.searchController.delegate = self;
self.searchController.searchResultsDataSource = self;
self.searchController.searchResultsDelegate = self;
//etc.;
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (tableView == self.searchController.searchResultsTableView)
{
rows = self.filteredPersons.count;
}
else
{
rows = [(NSSet *)[self.cardList valueForKey:@"cards"] count];
}
return rows;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
FLOG(@" called");
UILabel *nameLabel = nil;
bool filtering = NO;
static NSString *CellIdentifier = @"PersonCell";
MGSwipeTableCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[MGSwipeTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NSArray *subviews = [[NSArray alloc] initWithArray:cell.contentView.subviews];
for (UIView *subview in subviews)
{
[subview removeFromSuperview];
}
[cell setBackgroundColor:[UIColor clearColor]];
NSInteger count = 0;
Person *person;
if (tableView == self.searchController.searchResultsTableView)
{
person = [self.filteredPersons objectAtIndex:indexPath.row];
}
else
{
person = [[self sortPersons] objectAtIndex:indexPath.row];
}
...
- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
{
if (searchString.length==0)
{
self.filteredPersons = [[NSMutableArray alloc] init];
return NO;
}
[self.filteredPersons removeAllObjects];
if (searchString.length>0)
{
for (Person *person in self.sortPersons)
{
NSRange range = [person.compositeName rangeOfString:searchString options:NSCaseInsensitiveSearch];
if (range.location != NSNotFound)
{
[self.filteredPersons addObject:person];
}
}
}
NSLog (@" Filtered persons now %d", self.filteredPersons.count);
return YES;
}
Когда я проверить это с помощью таблицы с 4-мя рядами, если я нажимаю в SearchBar, появляется клавиатура, но таблица идет совершенно пустой , Еще одна вещь, которая неверна, сообщения отладки показывают, что numberOfRowsInSection вызывается несколько раз, чередуя между словами, что есть 4 строки и 0 строк! Когда я начинаю печатать, shouldReloadTableForSearchString вызывает вызов и, кажется, добавляет правильное количество строк в фильтрованный массив (два в тесте, в котором я работал). Используя отладочные сообщения, я вижу, что cellForRowAtIndexPath вызывается дважды и находит правильные имена в моем отфильтрованном списке, но таблица остается пустой. Кроме того, numberOfRowsInSection вызывается несколько раз, иногда говорят, что есть 2 строки, иногда 4.
Пожалуйста, может кто-нибудь дать мне некоторые идеи о том, что я сделал не так, или как отладить это.