iOS 8中已弃用searchDisplayController。

28

如何更正以下内容,以便不出现警告?我缺少什么?

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;
}

3
朋友,你认为那可能是什么?请参见上面编辑过的帖子。 - George Asda
1
没有固定的方法。您可以根据需要添加自己的ivar或property来跟踪它。 - rmaddy
4
你在开玩笑吧?我为什么要这样做才能完成一个一直免费提供的容易任务?苹果在想什么? - George Asda
4个回答

12

将以下内容添加到您的.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。 - mbbeme
简单明了的回答。 - Mihir Oza

12

13
如果苹果从Interface Builder中移除已弃用的类,那将会很有帮助。 - Daniel Wood

4

我想从UISearchDisplayController迁移到UISearchController。所以我在GitHub上找到了这个:https://github.com/dempseyatgithub/Sample-UISearchController
下载/克隆它,你就可以看到如何使用UISearchControllerUITableViewUICollectionView
它包含了升级从UISearchDisplayControllerUISearchController所需的一切。
UISearchController文档也非常有帮助。要入门,请查看Sample-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的两个版本,您需要通过编程方式完成所有操作。

0
我们花了很长时间来让新的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的原因。在UITableViewController上使用UISearchController不会出现旋转问题。
我们认为这是一种必要的解决方法,考虑到UISearchController目前的状态。最好有一个真正的解决方案来解决这个问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接