2015-04-13 2 views
0

Я пытаюсь добавить строку поиска в производный класс 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.

Пожалуйста, может кто-нибудь дать мне некоторые идеи о том, что я сделал не так, или как отладить это.

ответ

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

  • Нет связанных вопросов^_^