Подтвердить что ты не робот

SearchDisplayController устарел в iOS 8

Как вы исправляете следующее, чтобы не возникало никаких предупреждений? Что мне не хватает?

При исправлении searchResultsController до searchController это дает мне ошибку "объект не найден"

if (tableView == self.searchDisplayController.searchResultsTableView) {
        cell.textLabel.text = [searchResults objectAtIndex:indexPath.row];
    } else {
        cell.textLabel.text = [_content objectAtIndex:indexPath.row];
    }

    return cell;
}

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller
  shouldReloadTableForSearchString:(NSString *)searchString
{
    [self filterContentForSearchText:searchString
                               scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
                       objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
    return YES;
}
4b9b3361

Ответ 1

Класс UISearchController заменяет UISearchDisplayControllerкласс для управления отображением интерфейсов, связанных с поиском.

Источник: https://developer.apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS8.html

Итак, как сказал rmaddy, если вы хотите избавиться от устаревших предупреждений, прекратите использование устаревших классов. Вместо этого используйте UISearchController:

https://developer.apple.com/library/ios/documentation/UIKit/Reference/UISearchController/index.html#//apple_ref/occ/cl/UISearchController

Ответ 2

Добавьте это в ваш .h файл

<UISearchBarDelegate,UISearchResultsUpdating>

NSArray *searchResultsArray;
NSMutableArray *userMutableArray;

@property (retain, nonatomic) UISearchController *searchController;

и это в ваш .m файл

userMutableArray = [[NSMutableArray alloc] initWithObjects:@"Jack",@"Julie", nil];
searchResultsArray = [[NSArray alloc]init];

self.searchController = [[UISearchController alloc]initWithSearchResultsController:nil];
self.searchController.searchBar.scopeButtonTitles = [[NSArray alloc]initWithObjects:@"UserId", @"JobTitleName", nil];
self.searchController.searchBar.delegate = self;
self.searchController.searchResultsUpdater = self;
[self.searchController.searchBar sizeToFit];
self.searchController.dimsBackgroundDuringPresentation = NO;
self.definesPresentationContext = YES;
self.tableView.tableHeaderView = self.searchController.searchBar;


-(void)updateSearchResultsForSearchController:(UISearchController *)searchController{
    NSString *searchString = self.searchController.searchBar.text;
    NSPredicate *resultPredicate;
    NSInteger scope = self.searchController.searchBar.selectedScopeButtonIndex;
    if(scope == 0){
        resultPredicate = [NSPredicate predicateWithFormat:@"userId contains[c] %@",searchString];
    }else{
        resultPredicate = [NSPredicate predicateWithFormat:@"jobTitleName contains[c] %@",searchString];
    }
    searchResultsArray = [userMutableArray filteredArrayUsingPredicate:resultPredicate];
    [self.tableView reloadData];
}

- (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope{
    [self updateSearchResultsForSearchController:self.searchController];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if(self.searchController.active){
        return [searchResultsArray count];
    }else{
        return [userMutableArray count];
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellIdentifier;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if(!cell){
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }
    if(self.searchController.active){
        cell.textLabel.text = [searchResultsArray objectAtIndex:indexPath.row];
    }else{
        cell.textLabel.text = [userMutableArray objectAtIndex:indexPath.row];
    }
    return cell;
}

Ответ 3

Я искал переход от UISearchDisplayController к UISearchController. Итак, я нашел это на GitHub: https://github.com/dempseyatgithub/Sample-UISearchController
Загрузить/клонировать его, и вы сможете увидеть, как использовать UISearchController с UITableView и UICollectionView.
В нем есть все необходимое для обновления от UISearchDisplayController до UISearchController.
Документация UISearchController также очень полезна. Для начала рассмотрите пример UISearchController/MasterViewController_TableResults.m и Sample-UISearchController/MasterViewController_FilterResults.m
Если вам также необходимо поддерживать iOS 7 (что я лично рекомендую, если вы действительно собираетесь развернуть свое приложение в App Store), выполните следующие действия:

if([UISearchController class]){
//Create an UISearchController and add it to your UITableViewController
}else{
//Create an UISearchDisplayController and add it to your UITableViewController 
}

Примечание. Вы должны делать все программно, если хотите поддерживать обе версии iOS.

Ответ 4

Мы долго работаем, чтобы заставить новый UISearchController правильно вращаться.

Вот как это было раньше:

Через некоторое время мы существенно "отказались" от правильной работы вращения. Вместо этого мы просто скрываем контроллер поиска до того, как произойдет поворот. Затем пользователь должен нажать кнопку поиска на повернутом изображении, чтобы снова отобразить панель поиска.

Вот соответствующий код:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
    [self.searchController dismissViewControllerAnimated:YES completion:nil];
    self.searchControllerWasActive = NO;
    self.searchButton.enabled = YES;
}

Важное примечание. В нашем коде используется UIViewController, а не UITableViewController. Экран требует дополнительных кнопок, поэтому мы не можем использовать UITableViewController. Использование UISearchController в UITableViewController не отображает проблемы с ротацией.

Мы рассматриваем это как необходимую работу, учитывая текущее состояние UISearchController. Было бы гораздо лучше иметь реальное решение этой проблемы.