ios - 搜索 Display Controller is Deprecated in iOS8

标签 ios objective-c uisearchdisplaycontroller

我在尝试运行我的代码时收到上述警告消息。

NSDictionary *tempDictionary = nil;

    if (self.tableView == self.searchDisplayController.searchResultsTableView) {
        tempDictionary = [filteredCompanyArray objectAtIndex:indexPath.row];
    }
    else {
        tempDictionary= [self.client_list objectAtIndex:indexPath.row];
    }

它已被弃用并进行了谷歌搜索,但我所看到的只是 Swift 中的教程。

我在这里遵循了 Ray Wenderlich 教程 http://www.raywenderlich.com/16873/how-to-add-search-into-a-table-view但现在我卡住了。

#pragma mark Content Filtering
-(void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope {
    // Update the filtered array based on the search text and scope.
    // Remove all objects from the filtered search array
    [self.filteredCompanyArray removeAllObjects];
    // Filter the array using NSPredicate
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.name contains[c] %@",searchText];
    filteredCompanyArray = [NSMutableArray arrayWithArray:[self.client_list filteredArrayUsingPredicate:predicate]];
}

#pragma mark - UISearchDisplayController Delegate Methods
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString {
    // Tells the table data source to reload when text changes
    [self filterContentForSearchText:searchString scope:
     [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:[self.searchDisplayController.searchBar selectedScopeButtonIndex]]];
    // Return YES to cause the search result table view to be reloaded.
    return YES;
}

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchScope:(NSInteger)searchOption {
    // Tells the table data source to reload when scope bar selection changes
    [self filterContentForSearchText:self.searchDisplayController.searchBar.text scope:
     [[self.searchDisplayController.searchBar scopeButtonTitles] objectAtIndex:searchOption]];
    // Return YES to cause the search result table view to be reloaded.
    return YES;
}

最佳答案

下面的食谱对我有用。我刚刚成功更新了以前 iOS 7 代码的多个场景。

也感谢Updating to the iOS 8 Search Controller的启发和 Apple's API Reference

  1. 删除 UISearchDisplayDelegate 协议(protocol),添加 UISearchResultsUpdating 和 UISearchControllerDelegate 代替
@interface YOURTableviewController : UIViewController <UITableViewDelegate, UITableViewDataSource, /*UISearchDisplayDelegate, <- Removed*/ UISearchResultsUpdating /* Added */, UISearchControllerDelegate /* Added */>
{
  1. 添加新的 UISearchController 作为属性:
// New property
@property (nonatomic, strong) UISearchController *searchController;

// ...

@implementation YOURTableviewController

@synthesize searchController; // New property

并在didLoad方法中初始化新的属性

- (void)viewDidLoad
{
     // New code start -
     self.searchController = [[UISearchController alloc]     initWithSearchResultsController:nil];
     self.searchController.searchResultsUpdater = self;
     self.searchController.delegate = self;
     self.searchController.dimsBackgroundDuringPresentation = NO;

     self.searchController.searchBar.delegate = self;

     self.searchController.searchBar.barTintColor = [UIColor orangeColor];
     [self.tableview setTableHeaderView:self.searchController.searchBar];
     self.definesPresentationContext = YES;
     // - New code end

     // Previous code
     //self.searchDisplayController.searchBar.barTintColor = [UIColor orange]; 

     [super viewDidLoad];
}
  1. 添加新的 UISearchResultsUpdating 方法,更新 UISearchBarDelegate 方法,并可能添加如下所示的辅助方法,也可能添加 UISearchControllerDelegate 方法
#pragma mark -
#pragma mark UISearchResultsUpdating

- (void)updateSearchResultsForSearchController:(UISearchController *)_searchController
{
    NSString *searchString = _searchController.searchBar.text;
    [self searchForText:searchString];
    [self.tableview reloadData];
}

#pragma mark -
#pragma mark UISearchBarDelegate

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
    [self updateSearchResultsForSearchController:self.searchController];
}

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

// Extra method
- (void)searchForText:(NSString *)searchString
{
    /* Put here everything that is in the method:
     - (BOOL)searchDisplayController:(UISearchDisplayController *)controller     shouldReloadTableForSearchString:(NSString *)searchString
     ...BUT WITH NO RETURN VALUE */
}

#pragma mark -
#pragma mark UISearchControllerDelegate

- (void)willPresentSearchController:(UISearchController *)searchController
{
    //..
}
- (void)didPresentSearchController:(UISearchController *)searchController
{
    //..
}
- (void)willDismissSearchController:(UISearchController *)searchController
{
    //..
}
- (void)didDismissSearchController:(UISearchController *)searchController
{
    //..
}
  1. 替换并删除过时的 UISearchDisplayDelegate 方法
#pragma mark -
#pragma mark UISearchDisplayDelegate

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString 
{ ... }
  1. 用“searchController”替换所有地方的“searchDisplayController”

  2. 进行替换

代码如下:

if (tableView == self.searchDisplayController.searchResultsTableView)

可以替换为

if (self.searchController.isActive)

代码如下:

[self.searchDisplayController setActive:YES];

可以替换为

[self.searchController setActive:YES];

关于ios - 搜索 Display Controller is Deprecated in iOS8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31357437/

相关文章:

c# - NSAttributedString 不适用于 UITextField ios xamarin

ios - BFTask 在嵌套查询完成时返回

iphone - UISearchDisplayController—为什么我的搜索结果 View 包含空单元格?

ios - 使用 UISearchDisplayController 时 UITableViewCell 的 contentView 的内容不可见

iphone - 如何让我的 UIPickerView 在选定值之后显示标签?

ios - 如何使用 SKReceiptRefreshRequest 在 iOS 的 StoreKit 中恢复购买?

iphone - 找不到 'AbstractPickerView' 的接口(interface)声明, 'AttackLayer' 的父类(super class)

ios - 插入数据库在 iOS 中不起作用?

objective-c - 在特定项目中使用框架的静态库

iphone - 设置导航栏隐藏 :YES doesn't work with the searchDisplayController